2014-03-03 198 views
0

我使用md5與隨機代碼,當前日期時間和customer_id生成哈希碼,但在運行200,000條記錄後,我發現有很多重複的記錄。我如何避免重複?MD5隨機生成代碼重複

while ($row = mysql_fetch_array($result, MYSQL_NUM)) { 

$curr_date = date('Y-m-d H:i:s'); 
$hash = md5(rand(0,100000)+strtotime(date('curr_date'))+$row[0]); 

echo $query = "update customers set email_hash='$hash' where customer_id='$row[0]'"; 
mysql_query($query) or die(mysql_error()); 
} 
+0

哈希值不是唯一的,所以請考慮其他可避免重複問題的東西。 –

+0

沒有「重複」的「隨機」概念沒有意義。雖然您可以通過更少的碰撞獲得更好的隨機分佈,但仍需要考慮這些碰撞。如果分佈是好的,你可能會輕易地重複哈希生成和更新罕見的碰撞。 (還要考慮SQL語句中的MD5(RAND())。) – danorton

回答

0

,而不是使用當前日期嘗試使用當前時間戳是時間()

$散列= MD5(蘭特(0,100000)+的strtotime(時間())+ $行[0] );

0

問題在於,對於多達數千個條目,時間可能相同,因爲您只花費時間達到秒鐘。你也可以嘗試使用毫秒和納秒,或者在兩代之間休眠。

但是無論如何,使用另一個散列算法和更多的散列位來安全,這樣碰撞的可能性就會降低。

0

時間戳添加到您的MD5

$hash = md5(rand(0,100000)+strtotime(date('curr_date'))+$row[0])."_".time(); 
0
  1. 您使用date()錯誤。

    date('c') 
    
  2. 您將添加爲數字而不是拼接爲字符串。

    rand(0,100000) . strtotime(date('c')) . $row[0] 
    

因爲它是你只使用極少數的哈希可能的明文。解決這兩個問題將大大減少衝突的次數。