2011-06-03 67 views
5

被用戶存儲上傳文件的磁盤文件夾中的遠程服務器上更改文件來對於sha1或uniqid磁盤上的文件的隨機名稱,哪個更好?

$filename = '/tmp/foo.txt'; 
$newName = sha1_file($filename); // 40 characters 
//or I can do 
$newName = uniqid($filename) // 13 characters 

這是新的名字,是不是可能失敗更魯棒的方法的名稱? 謝謝。

+0

你的失敗是什麼意思? – Thilo 2011-06-03 08:09:59

+0

@thilo by fail我的意思是該函數的穩定性。 – 2011-06-03 08:19:39

+1

但是sha1_file對於1)跟蹤重複2)創建一個平衡的樹命名模式 – symcbean 2011-06-03 08:40:30

回答

6

一個更好的解決方案是使用tmpfile()tempnam()。任何一個都可以保證創建一個不會被碰撞的未使用的文件,並且不會被流氓進程「更改權限」所攔截。 tmpfile()自動刪除當它關閉該文件,而tempnam()保持它周圍

http://www.php.net/manual/en/function.tmpfile.php

http://www.php.net/manual/en/function.tempnam.php

+0

是的,使用'tempnam()'函數來獲取給定目錄中未使用的文件名。其他帶有散列值和隨機值的解決方案可以返回已經在使用的文件名,如果有一個簡單的方法可以做到這一點,您爲什麼要把它留給運氣? – martinstoeckli 2011-06-03 08:35:36

+0

我同意,tempnam()比uniqid()更好。但它可能並不比sha1_file好 - 您可能想要存儲具有相同名稱的相同文件,以避免兩次存儲相同的數據。 – Matt 2011-06-03 09:10:39

+0

@Matt - 使用sha1_file()的解決方案在實踐中可能會很好地工作,儘管我不熟悉它。要麼你知道一個文件是相同的,應該被覆蓋/重用,否則你不應該假設它。散列算法旨在允許衝突,在這種(罕見)情況下,您將覆蓋/共享不同用戶的數據。 – martinstoeckli 2011-06-03 09:44:25

1

都不應該提供相互衝突的名稱。 sha1_file計算密集得多,但它具有有用的屬性,如果兩個用戶上傳完全相同的文件,它將被賦予相同的名稱,並且只存儲一次。如果你不希望很多人上傳相同的文件,或者不關心存儲兩次,uniqid將運行得更快。

1

無論是哪種情況,您都希望檢查文件是否已經存在。 如果你想成爲100%的安全和文件不是太大就用

sha1_file($filename); 

這將拉動SHA-1爲整個文件,這樣即使文件已經存在的內容是一樣的。

和平

1

SHA1 - 與任何散列函數beeing確定性的優勢。在你的情況下,這可能是不需要的。 對此只使用一個散列函數會導致相同文件(可能在現實生活中發生)發生衝突。

在這種情況下,uniqueid更好。 儘管13個字符的較小範圍表示配對概率要高得多,但事實並非如此,因爲很少有2個文件在同一時間上傳。即使如此,使用文件名作爲前綴(並且通過這增加了您的$ newname的長度)在大多數情況下可以避免衝突。 如果你想確定,你可能想要添加一些循環檢查現有文件,並重建名稱,直到你沒有碰撞(或給出了一些break-condition)。