我需要从32位数字创建一个16位散列,并且我试图确定一个简单的模数2 ^ 16是否合适。
哈希将用于2 ^ 16条目哈希表中,以便快速查找32位数。
我的理解是,如果数据空间具有相当均匀的分布,那么简单的mod 2 ^ 16就可以了 - 它不应该导致太多的冲突。
在这种情况下,我的32位数是修改后的adler32校验和的结果,使用2 ^ 16作为M.
因此,从一般意义上讲,我的理解是正确的,如果我有一个偶数数据分布,那么使用一个简单的mod n(其中n是散列表大小)作为散列函数是没问题的吗?
具体来说,adler32会为此提供足够随机的分布吗?
答案 0 :(得分:1)
是的,如果您的32位数字均匀分布在所有可能的值上,则其中的模数也将均匀分布在n个可能的值上。
修改后的校验和算法的结果是否均匀分布是一个完全不同的问题。这取决于您应用算法的数据是否具有足够的数据来多次滚动总和。如果您将算法应用于不会翻转总和的短字符串,则结果将不均匀分布。
如果你想要一个哈希函数,那么你应该使用哈希函数。 Adler-32和任何CRC都不是一个好的散列函数。公共领域中有许多非常快速有效的哈希函数。您可以查看CityHash。