[hash] MD5是否仍然足以唯一地識別文件?



Answers

出於實際的目的,所創建的散列可能是適當的隨機數,但理論上總是有碰撞的概率,這是由於Pigeonhole原理 。 具有不同的散列值意味著這些文件是不同的,但獲得相同的散列值並不一定意味著這些文件是相同的。

為此目的使用哈希函數 - 無論安全性是否擔憂 - 因此應始終只是檢查的第一步,特別是如果已知哈希算法容易產生衝突。 要可靠地找出兩個具有相同散列的文件是否不同,則必須逐字節比較這些文件。

Question

MD5哈希一個文件仍然被認為是一個足夠好的方法來唯一標識它給予所有的破壞MD5算法和安全問題等? 安全性不是我最關心的問題,但唯一標識每個文件是。

有什麼想法嗎?




就我個人而言,我認為人們使用原始校驗和(挑選你的方法)其他對像作為唯一標識符太多時,他們真正想要做的是有唯一的標識符。 指定一個對像用於此用途不是意圖,並且可能比使用uuid或類似的完整性機制需要更多的思考。




一個MD5可能會產生衝突。 從理論上講,儘管不太可能,但連續數百萬個文件可以產生相同的散列。 在存儲值之前,不要測試你的運氣並檢查md5衝突。

我個人喜歡創建隨機字符串的MD5,這減少了散列大文件的開銷。 當發現衝突時,我迭代並用附加的循環計數器重新散列。

你可以閱讀鴿子的原理




當散列短(<K幾個K)字符串(或文件)時,可以創建兩個md5散列鍵,一個用於實際字符串,另一個用於字符串反向與短不對稱字符串連接。 例如:md5(reverse(string ||'1010'))。 添加額外的字符串可確保即使是由一系列相同位組成的文件也會生成兩個不同的密鑰。 請理解,即使在此方案下,兩個散列密鑰對於不相同的字符串而言是相同的理論上的機會,但概率似乎非常小 - 按照單個MD5衝突概率的平方的順序,並且節省時間在文件數量不斷增長的情況下可能相當可觀。 也可以考慮製作第二個字符串的更精細的方案,但我不確定這些方案是否會顯著提高賠率。

要檢查衝突,可以運行此測試以獲取db中所有bit_vector的md5哈希鍵的唯一性:

使用bit_vector從db中選擇md5(bit_vector),count(*),bit_and(bit_vector)
由md5(bit_vector)組成,具有bit_and(bit_vector)<> bit_vector的bit_vector




Links



Tags

hash   md5