创建一百万个短字符串的唯一整数/浮点哈希值

时间:2012-03-16 20:04:35

标签: php hash numbers rdbms hash-collision

大多数应用程序,尤其是数据库,可以通过小整数或浮点数进行排序和过滤,这比它们进行字符串比较要快得多。

因此我想知道是否有一个哈希函数可以用来返回一个32位或64位短字符串(大约5-40个字符),以便我可以用整数而不是用字符串进行比较。

我首先想到的是crc32,但它似乎太小而且would result in possible collisions in less than 50,000 hashes(我需要超过一百万)。

我最感兴趣的是使用Python,PHP,V8 Javascript,PostgreSQL和MySQL。

1 个答案:

答案 0 :(得分:2)

在所有32位哈希值中,冲突可能发生在50k条目的问题。如果你在Birthday problem上读了一下,如果你有大约sqrt(HashSpace)个元素,你会发现碰撞很可能发生,例如sqrt(2^32) = 64k用于32位哈希。


64位哈希冲突变得更加罕见。但是我仍然觉得我的计划的正确性并不太令人满意。

使用维基百科的近似值:

对于100万个元素,我们获得3 * 10 -8 的概率,对于1000万个元素,我们获得3 * 10-6的概率。

您可以使用CRC64。或者只是将加密哈希(例如md5或sha1)截断为所需的长度。


如果恶意人员可以选择字符串,通过故意创建冲突来破坏程序,则至少应切换到密钥哈希,例如HMAC。


根据您正在做的事情,您还可以简单地在string和int之间创建内存映射,您只需为遇到的每个元素递增计数器。这为您提供了完美的映射,没有碰撞风险,但仅适用于某些情况。