【问题标题】:What is the purpose of std::hash and/or boost::hash ?std::hash 和/或 boost::hash 的目的是什么?
【发布时间】:2012-12-10 15:49:05
【问题描述】:

为什么要提供哈希函数而不指定任何引用实现,也没有指定引用算法(md5、sha256 等)?

数据结构也有类似的功能,例如符合 C++ 标准的std::unordered_map/set/multimap/multiset::hash_function

所以我不明白的是:

  • 为什么要提供这种未记录的方法
  • 实现细节是正确使用散列函数的基础,从程序员的角度来看,这些函数的用途是什么
  • 此函数可以链接到特定算法?

【问题讨论】:

  • std::hash 和 sha/md5 是不同的东西。 std::hash 用于为数据结构查找等生成哈希码。它并不意味着是一个加密哈希函数。

标签: c++ c++11 hash stdhash


【解决方案1】:

为什么要提供这种未记录的方法

它们不是无证的。

实现细节是正确使用散列函数的基础,从程序员的角度来看,这些函数的目的是什么

实现是未指定的,它们只是应该与无序容器一起使用。它们应该是尽可能好的散列函数,以有效地将元素分配到桶中。其他任何内容都未指定。

请注意,如果使用具有用户定义类型的无序容器,用户需要提供这些。

这个函数可以链接到特定的算法吗?

为什么不呢?

【讨论】:

  • “它们应该是尽可能好的散列函数”它们“应该”吗?真的吗?当我谈到没有文档时,我顺便提到了实现细节,这是处理散列函数时通常唯一重要的事情。
  • @user1824407:并非如此,无序容器即使使用最糟糕的哈希函数也能正常工作...... has 函数的质量不会影响行为,只会影响性能。
  • 好的,对于数据结构,如果有一个好的逻辑,你可以避免这个问题,但是 std::hash 呢?如果我需要依赖哈希函数 10 年或更长时间,并且它的实现基本上是特定于编译器的,并且可能会随着时间的推移而改变:那有什么意义?
  • @user1824407:当然不能!它们应该将元素分配到存储桶中。如果您需要其他内容的哈希,请创建您自己的实现,您可以控制...
  • 我认为他的问题令人困惑。 std::hash 和 boost::hash 不是加密哈希函数,也不是 SHA 或 MD5 的包装器。如果您查看文档,您会发现它们不适用于加密应用程序 (en.cppreference.com/w/cpp/utility/hash)。你需要看看像 OpenSSL 这样的东西。
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 2021-12-31
相关资源
最近更新 更多