寻找生产质量哈希表/无序地图实现学习?

时间:2010-06-13 07:02:37

标签: c++ python c hashtable hash

  1. 在C或C ++或Python中寻找好的源代码,以了解如何实现散列函数,以及如何使用它实现散列表。
  2. 关于hash fn和hash table实现如何工作的非常好的材料。
  3. 提前致谢。

3 个答案:

答案 0 :(得分:3)

Hashtables是Python的核心,既可以作为'dict'类型,也可以作为类和名称空间的实现,因此多年来已经对实现进行了改进和优化。您可以看到dict对象here的C源代码。

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

答案 1 :(得分:2)

您的问题存在问题:哈希映射的类型与使用的一样多。

根据您的约束,有许多策略可以处理哈希冲突和重新分配。你可能会发现一个平均的解决方案,当然,大多数都适合,但如果我是你,我会看维基百科(像丹尼斯建议的那样)来了解各种实现的细微之处。

正如我所说,你可以通过两种方式来思考这些策略:

  • 处理哈希碰撞:铲斗,哪种?打开地址?双哈希? ...
  • 重新分配:冻结地图还是线性摊销?

另外,您想要多线程支持吗?使用atomic操作可以获得无锁的多线程哈希映射,如已在Java中通过Cliff Click(Google Tech Talk)验证

正如您所看到的,没有一种尺寸适合所有人。我会先考虑学习这些原则,然后再深入了解实现细节。

  • C ++ std::unordered_map使用链表清单并冻结地图策略,不用担心STL正常同步。
  • Python dict是该语言的基础,我不知道他们选择的策略

答案 2 :(得分:1)

如果您想学习,我建议您查看java.util.HashMap的Java实现。这是明确的代码,记录良好且相对较短。承认,它既不是C,也不是C ++,也不是Python,但你可能不想阅读GNU libc ++即将推出的哈希表实现,最重要的是它包含了C ++标准模板库的复杂性。

首先,您应该阅读java.util.Map接口的定义。然后,您可以直接跳转到java.util.HashMap的详细信息。所有遗漏的东西都会在java.util.AbstractMap中找到。

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