2010-06-13 81 views
3

假設我有任何「長」散列,如16字節的MD5或20字節的SHA1。 我想減少這個散列以適合4個字節,用於GetHashCode()目的。如何「減少」散列?

首先,我完全知道我會碰到更多的碰撞。對我來說這完全沒問題,但我仍然希望儘可能減少碰撞。

有幾種解決方案,以我的問題:

  • 我可以把哈希的4個字節首。
  • 我可以拿走散列的最後4個字節。
  • 我可以取4個隨機字節的散列。
  • 我可以生成哈希散列,涉及經典素數乘法。

有沒有其他解決方案我沒有考慮?更重要的是,什麼方法會給我最獨特的哈希碼?我目前假設他們幾乎相同。

Microsoft選擇程序集的公鑰標記是其公鑰的SHA1哈希的最後8個字節,所以我可能會選擇此解決方案,但我想知道原因。

回答

8

任何散列已經減少。

加密哈希的設計使得數據的任何部分對哈希的任何部分的影響都不會超過任何其他部分。所以,你選擇哪個散列位並不重要。

1

如果您隨機使用4個字節,則會出現兩個完全相同的SHA1哈希產生不同GetHashCode哈希值的情況。

我只是選擇前4個字節 - SHA1的設計使得沒有字節應該與任何其他字節集一樣重要。

+1

你的意思是,「沒有字節應該比任何其他集合更重要? – 2010-06-13 16:07:19

5

除了第三個選項 - 隨機選取字節 - 的任何選項都可以正常工作。如果你隨機選取字節,相同的輸入將會每次產生不同的散列碼,這就破壞了散列碼的目的。

+1

我當然在想'硬編碼'隨機。儘管感謝您的反饋。 – 2010-06-13 16:16:33

+4

@Julien:啊哈,一個隨機常量... http://www.xkcd.com/221/;) – Guffa 2010-06-13 16:41:18

0

如果您有散列的合理數量,對其進行索引(在數據庫例如存儲):

1 - 987baf9gfd79b7979debe90085eadf5 
2 - 9754gccgfd79s7979abbc90085eadf5 
... 
0

如果您當前的哈希保持爲一個字符串,只需調用該字符串的GetHashCode,它將返回你一個int,4個字節。

有什麼用?