2012-03-16 91 views
2

大多數應用程序(尤其是數據庫)可以按小整數進行排序和過濾,也可以比字符串比較快得多。創建百​​萬個短字符串的唯一整數/浮點哈希值

因此,我想知道是否有一個哈希函數,我可以用它來返回一個短字符串(約5 - 40個字符)的32位或64位數字,以便我可以用整數而不是字符串進行比較。

我首先想到的是crc32,但它似乎太小了一些數字和would result in possible collisions in less than 50,000 hashes(我需要做超過一百萬)。

我最感興趣的是在Python,PHP,V8 Javascript,PostgreSQL和MySQL中工作。

回答

2

所有32位散列都存在固有的50k條目衝突問題。如果您在Birthday problem上閱讀了一些內容,您會發現如果您有大約sqrt(HashSpace)個元素(例如,用於32位散列的sqrt(2^32) = 64k


隨着64位散列衝突變得更加罕見。但是我仍然不太願意在這方面投我的項目的正確性。

使用從維基百科的近似值:

我們獲得的3×10 -8 1種百萬個元素,和3×10-6 10個百萬個元素的概率。

你可以使用CRC64。或者只是截斷一個加密哈希,如md5或sha1到所需的長度。


如果有惡意的人可以選擇的字符串,通過故意製造衝突破壞你的計劃,你應該至少切換到一個加密散列,如HMAC。


取決於你在做什麼,你也可以簡單地創建字符串和INT之間的內存映射下,你根本增量你遇到的每個元件的對。這爲您提供了完美的映射,沒有碰撞風險,但僅適用於某些情況。

+0

A%0.000003與1000萬個元素髮生碰撞的概率?聽起來像是值得試圖看看我是否碰到任何碰撞。我發現[這*未經測試* crc64 PHP函數](http://www.php.net/manual/en/function.crc32.php#106216)可能工作。我會用一個計數器手動增加一個數字,但是我唯一的輸入是每次需要轉換爲相同數字的單詞。我想我可以查找單詞=數字和*然後使用數字*。 – Xeoncross 2012-03-16 20:39:03