hashmap - 为什么 HashMap 需要加密安全的哈希函数?

标签 hashmap rust hash-function

我正在读一本关于 HashMap 的 Rust 书 hashing functions ,我看不懂这两句话。

By default, HashMap uses a cryptographically secure hashing function that can provide resistance to Denial of Service (DoS) attacks. This is not the fastest hashing algorithm available, but the trade-off for better security that comes with the drop in performance is worth it.

我知道什么是加密安全散列函数,但我不明白其背后的基本原理。根据我的理解,HashMap 的一个好的哈希函数应该只有三个属性:

  • 确定性(同一对象具有相同的哈希值)
  • 要非常快,
  • 在散列值中具有均匀分布的位(意味着它将减少冲突)

在 99%(甚至可能是 99.99%)的时间内,哈希表的其他属性在加密安全哈希函数中并不真正相关。

所以我的问题是:什么是“抵抗 DoS 攻击和更好的安全性” "甚至在 HashMap 的上下文中是什么意思?

最佳答案

让我们从头开始:您如何对 HashMap 进行 DoS?

多年来,针对各种基于Hash Flooding的软件堆栈的攻击已经多次发生。 .如果您知道站点由哪个框架提供支持,因此使用了哪个散列函数,并且该散列函数在密码学上不安全,那么您可以离线预先计算一大组字符串散列为相同的数字。

然后,您只需将这个集合注入(inject)网站,对于每个(简单的)请求,它都会做大量的工作,因为插入 N 个元素需要 O(N2) 次操作。


Rust 的构想是事后诸葛亮,因此注意避免这种攻击默认,理由是真正需要 HashMap 性能的用户会简单地切换哈希函数。

关于hashmap - 为什么 HashMap 需要加密安全的哈希函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52184366/

相关文章:

java - 将十进制格式(html 编码)的 Unicode 字符字符串转换为常规字符串

generics - 如何静态地强制泛型类型具有特定的表示形式?

java - 如何多次哈希并在每轮中连接一个字符串

java - 使用流从字符串列表创建映射

java - 用于存储键值对的轻量级数据库类库

java - 如何知道/获取hashmap的容量?

rust - 如何在 rocket.rs 中使 postgres 池连接全局化并使 FromRequest 自定义守卫异步?

data-structures - 如何在不需要分配给新变量的情况下为链表实现前置?

c++ - unordered_map 哈希函数 C++

hash-function - 用于映射 5 到 7 张卡的组合的哈希函数