我有64位正整数(范围从0到2 63 - 1)我希望将它们散列为32位正整数(0到2 31 - 1范围)。
我的数据有高斯分布。任何人都可以建议一个哈希函数,它会为这个分布提供少量的冲突吗?
(原始问题是here,我已对此进行了改进。)
答案 0 :(得分:3)
您可以先通过(预期的)累积分布函数映射您的输入数据,然后输出然后(预期)均匀分布。然后,您可以将该数据放入常规的64到32位哈希函数中。
答案 1 :(得分:2)
基于Long的散列,它是一个64位整数。
int hash = (int) ((l >>> 32) ^ l);
顺便说一句:gaussian distribution已签名,我认为它不适合无符号值。
如果您的某些东西遵循已经缩放和移位的高斯分布,则较低的32位可能仍然是完全随机的。 (取决于比例)如果较低的32位是随机的,那么高位是什么(它们都可以是0)并不重要,并且散列仍然是伪随机的。
BTW:即使您的哈希值在转换为32位值时是唯一的,您也必须进一步减少这一点以节省内存(除非您有自己的哈希表,其大小为2 ^ 32)这意味着在减少之后价值进一步合理,例如如果样本数量增加一倍,就会发生一些冲突(除非事实证明你的64位值远远超过你需要的位数)