2014-06-11 83 views
1

我將圖像上傳到S3,我希望爲每個上傳的圖像創建一個唯一的名稱。散列圖像名稱

我使用的干預,使圖像:

$img = Image::make($file->getRealPath()); 

然後我散列圖像:

$name = hash('sha256', $img); 

問題是,當我上傳了相同的圖像,它給了相同的名稱。

我該如何解決這個問題?

+1

嘗試'$名稱=散列( 'SHA256',$ IMGM,假)' – SJD

回答

0

你應該儘量鹽添加到它。即使追加日期/時間應該給你一個獨特的名字。 乾杯!

PS(編輯):

$data = Image::make($file->getRealPath())->encode('data-url'); 

$name = hash('sha256', $data . strval(time())); 

首先我們編碼在「字符串的方式」中的數據,所以我們可以連接的時間價值爲字符串。

如果你想額外的 「隨機性」 添加用戶的cookie,用戶名等

最終的解決方案:

$數據=破滅( '',文件($文件 - > getRealPath())); ()()()()());

+0

您能告訴我一個如何做到這一點的例子嗎? – user3729576

+0

$ data = Image :: make($ file-> getRealPath()) - > encode('data-url'); $ name = hash('sha256',$ img。strval(time())); – Cucu

+0

我最近的編輯不是最佳的,但應該工作。沒有測試過! – Cucu

1

您是否考慮過使用com_create_guid()來創建全局唯一標識符?這會爲您提供每個文件的唯一名稱。例如:

$name = com_create_guid(); 
+0

這是一個延伸?我寧願不使用擴展名。 – user3729576

+0

哦,是的。還有uniqid()http://www.php.net//manual/en/function.uniqid.php這也是一個基本的擴展。使用UUID爲上傳文件生成唯一的文件名是很常見的(至少在.NET世界中)。 – user2444499

0

避免這種情況的最佳方法是使用每個上傳的時間戳。 只需使用time()函數將$ img與當前時間戳結合即可。

例如:

hash('sha256', $img+time()); 
+0

無法將圖像轉換爲int – user3729576

-1

你可以嘗試添加蘭特()

hash('sha256', $img . rand(1,100)); 
+0

這仍然給他的danager,相同的隨機數將被選中。 即使它的1%,你仍然沒有消除他正試圖解決的問題。 –