![]() |
1
3
碰撞的概率也取决于输入数据的预期分布。在您的示例中,假设输入数据在整个范围内均匀分布。这是理想的情况,这两种算法都表现良好也就不足为奇了。 但是,如果假设输入数据通常在高位相似,并且只在低位不同(注意:许多实际数据是这样的),质数方法将把这种变化分散到整个散列中,而异或方法将不会-在低位有小的变化两个或多个值的s在执行异或运算时很容易互相抵消,因此质数方法在这种情况下不太可能发生冲突。 另外,对于gethashcode,应该使用32位值,而不是8位值。 |
![]() |
2
1
截断散列是这里的问题。异或方法只能产生256个不同的值。prime方法可以生成超过750000个不同的值,但是只使用8个低位就可以丢弃其中的749744个值。因此,它永远不会比xor做得更好。 在你的具体情况下,你可以做得更好。整数中有足够的位生成具有1600万个不同值的唯一哈希:
当输入值分布良好时,xor方法是可以接受的。prime方法的一个问题是很容易触发溢出异常。这在vb.net代码中很难处理,因为它没有与c unchecked关键字等价的关键字。必须使用project+属性、compile选项卡、高级编译选项、勾选“删除整数溢出检查”全局关闭该选项。通过将散列计算为int64来避免这种情况。所以有点贵。 |
![]() |
Emopusta · 从后端到前端的图像路径不工作 2 年前 |
![]() |
Asdrubal Hernandez · Linq查询特定数组索引出错 2 年前 |
![]() |
Niyazi Babayev · 如何在表达式中动态应用表达式? 2 年前 |
|
Dansih · .Net核心自定义身份验证方案 2 年前 |
![]() |
lolorekkk · 面板插入。NET WinForm 2 年前 |