Java 默认字符串哈希函数在单个字符串上产生冲突

标签 java hash hashmap hashtable

我是学计算机的,所以如果我说的太荒谬,请多多包涵。它对我来说确实如此,这就是为什么我在这里寻找答案。 我阅读了如何在 Java 中散列字符串,然后查看了 ASCII 表。字母“d”和“n”分别哈希为 100 和 110。现在,如果我要用 Java 创建一个全新的 hashmap,默认情况下它有 10 个桶。因此,即使哈希码是唯一的,mod 10 它们都是 0。这会导致冲突。 在 1 个字符串上发生冲突并不适合我,那么我描述的过程是否正确? 提前致谢。

最佳答案

您描述的可能是正确的,由于 pigeonhole principle,两者将落在同一个桶中,这基本上意味着如果你的元素多于放置它们的孔,那么两个或更多的元素最终会落在同一个孔上。在这种情况下,仅考虑 95 个可打印的 ASCII字符,原理是每个洞至少有10个(不考虑实际值,只考虑数量)。

但是,shazin 的答案也是正确的,因为哈希值实际上并未用作映射中值的标识,而是用于查找 kay/value 对所属的桶,然后在中查找值使用它们的 equals() 方法检查存储桶是否相等(或者使用 ==,如果使用 IdentityHashMap。)

关于Java 默认字符串哈希函数在单个字符串上产生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30971703/

相关文章:

java - HTMLUnit - 如何获取传出连接列表作为列表?

ruby - 在 ruby​​ 中合并一些复杂的哈希值

java - "HashMap$Entry cannot be cast to X"尝试使用循环从 Map 中提取值时

java - 在枚举中添加映射并将键和值放入其中?

java - 如何在 HashMap java 中删除 "{"

java - 如果值为空则设置数据库的默认值

java - org.xml.sax.SAXParseException : The content of elements must consist of well-formed character data or markup

c# - C# 中的 DJBX33X 哈希函数

java - 当 "salted"时,SHA512 哈希给出不正确的(?)结果

ruby - 将数组元素转换为哈希