java - HashMap 键不是随机的

标签 java security hash collections hashmap

似乎 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/

相关文章:

Java邮件 : fetching messages for the last hour

java - 无法在java中使用此正则表达式提取字符串

java - 通过将文件置于安全的网络连接后面来保护文件

c# - "User.Identity.Name"安全吗?

c - 对于相同的值,double 中的字节散列是否始终相同?

java - 如何在 Java IDL 中使用自定义类型

java - Java简单的弹跳球程序

java - 安全事项 : are parameters in url secure?

python - 关于可哈希对象的解释需要解释

hash - 用于数据完整性和重复数据删除的最佳散列算法有哪些?