似乎 Java 的 HashMap 实现总是将键放在相同的容器中(至少我看到了整数键)。 IE。散列是确定性的,在所有运行中它产生相同的值。
我听说有些语言会随机插入,因此出于安全原因, key 将存储在哪个存储桶中是不可预测的。
为什么 Java 的键总是相同的?
最佳答案
此处感兴趣的攻击是拒绝服务 (DoS)。对手选择一组击中同一个桶的 key 。这将映射操作的性能从 O(1) 转换为 O(n)。这样做 n 次(比如构建 map ),我们从 O(n) 到 O(n^2)。还存在定时攻击的可能性,但我会方便地忽略它。
一般来说,大多数库代码都假定无需采取任何措施来避免 DoS。然而,最近一些 Java 实现使用 MURMUR 哈希来随机化 String
的哈希函数以避免某些攻击。 MURMUR 将每个进程的随机数混合到哈希码的生成中,这样该函数对于进程是稳定的,但很难(尽管不一定不可能)从外部计算出来。最近,如果发生过多的冲突并且 key 适本地实现了 Comparable
,这已被回退到树结构所取代。
如果您在找到代码的情况下担心此类攻击,您可以使用其他 Map
实现,例如 java.util.TreeMap
。
关于java - HashMap 键不是随机的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30226063/