【问题标题】:Looking for production quality Hash table/ unordered map implementation to learn?寻找生产质量哈希表/无序映射实现来学习?
【发布时间】:2011-03-03 03:52:14
【问题描述】:
  1. 寻找 C 或 C++ 或 Python 中的良好源代码,以了解如何实现哈希函数以及如何使用它来实现哈希表。
  2. 关于哈希 fn 和哈希表实现如何工作的非常好的材料。

提前致谢。

【问题讨论】:

  • 哈希函数的详细信息取决于您正在哈希的对象的类型。
  • 维基百科提供了各种信息,包括几个实现的链接。 en.wikipedia.org/wiki/Hash_table

标签: c++ python c hashtable hash


【解决方案1】:

Hashtables 是 Python 的核心,无论是作为“dict”类型还是用于类和命名空间的实现,因此多年来一直在改进和优化实现。可以看到dict对象here的C源码。

每种 Python 类型都实现了自己的哈希函数 - 浏览其他对象的源代码以查看它们的实现。

【讨论】:

    【解决方案2】:

    想学的时候,建议看java.util.HashMap的Java实现。它是清晰的代码,有据可查且相对较短。承认,它既不是 C,也不是 C++,也不是 Python,但你可能不想阅读 GNU libc++ 即将实现的哈希表,它首先包含 C++ 标准模板库的复杂性。

    首先,您应该阅读java.util.Map 接口的定义。然后你可以直接跳转到java.util.HashMap的详细信息。您可以在java.util.AbstractMap 中找到所有缺失的内容。

    一个好的散列函数的实现独立于编程语言。它的基本任务是将一个任意大的值集映射到一个小的值集(通常是某种整数类型)上,从而使结果值均匀分布。

    【讨论】:

      【解决方案3】:

      你的问题有一个问题:哈希映射的类型有多少用途就有多少。

      有很多策略可以处理哈希冲突和重新分配,具体取决于您的约束条件。当然,您可能会找到一个最适合的平均解决方案,但如果我是您,我会查看维基百科(就像丹尼斯建议的那样)以了解各种实现的细微之处。

      正如我所说,您主要可以通过两种方式来考虑策略:

      • 处理哈希冲突:桶,哪种?开放寻址?双哈希? ...
      • 重新分配:冻结地图还是摊销线性?

      另外,你想加入多线程支持吗?使用atomic 操作可以获得无锁多线程哈希映射,正如 Cliff Click (Google Tech Talk) 在 Java 中所证明的那样

      如您所见,没有一种尺寸适合所有人。我会考虑先学习原理,然后再深入了解实现细节。

      • C++ std::unordered_map 使用链表存储桶并冻结映射策略,无需像往常一样与 STL 正确同步。
      • Python dict 是语言的基础,我不知道他们选择的策略

      【讨论】:

        猜你喜欢
        • 2023-01-18
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        • 1970-01-01
        • 2018-10-13
        • 1970-01-01
        • 1970-01-01
        • 2017-10-04
        相关资源
        最近更新 更多