有什么简单的方法可以将32位整数(例如IP地址,例如Unix time_t等)散列为16位整数?

例如。 hash_32b_to_16b(0x12345678)可能返回0xABCD

让我们以一个可怕但实用的示例解决方案开始:

function hash_32b_to_16b(val32b) {
    return val32b % 0xffff;
}

问题特别是关于JavaScript的,但是可以随意添加任何与语言无关的解决方案,最好不要使用库函数。

这个问题的内容是生成唯一的ID(例如,一个64位ID可能由多个具有各种32位值的16位哈希组成)。避免碰撞很重要。

简单=好。古怪+模糊=有趣。

最佳答案

这取决于整数的性质。
如果它们可以包含一些位掩码,或者可以相差2的幂,则简单的XOR发生冲突的可能性很高。
您可以尝试使用(i>>16) ^ ((i&0xffff) * p)之类的东西,其中p是质数。

像MD5这样的安全性杂凑都很好,但是在这里显然是过大了。任何比CRC16更复杂的方法都不过分。

10-08 07:12