关于哈希值为什么不能避免冲突的一些思考

关于哈希值为什么不能避免冲突的一些思考

起因

刚刚在复习equals和hashCode方法时,自己写了简单的switch来判断字符串

源码如下

编译后代码如下

思考

我之前理解是因为哈希表的实现是一个数组,这个数组设计为能够把所有对象塞进去的,所以有个前提是要能计算出对象的数组下标。

哈希表数组的下标可以简单理解为哈希值取模得到的,这样下标重复产生的冲突很容易理解,但编译后的Java代码不仅对比了哈希值还对比equals,这让我有了个疑问:为什么哈希值不能完全不一样?为什么哈希值不能完全避免冲突呢?反正最后取模就可以确定下标了嘛。

结论

思考过后,想通了。正如哈希表是由有限的数组实现的,即使在极为理想的情况下所存储的对象如果超出了数组大小也要不可避免的解决冲突,哈希值也是如此。哈希值是int,Integer、Long都是有最大值的上限,在面对无穷的排列组合面前也得跪,一定长度的字符串拥有非常大的排列组合数量,所以哈希值的碰撞也是可以理解了,所以编译后的代码才会变成看到的这样。先利用哈希值做快速判断,如果实在不幸,哈希值碰撞了,就老老实实去对比每一个byte(Java11)。


关于哈希值为什么不能避免冲突的一些思考
https://blog.gugu.dev/2024-02-21/关于哈希值为什么不能避免冲突的一些思考/
作者
MinMin
发布于
2024年2月21日
许可协议