【问题标题】:How do standard libraries implement hash tables in practice? [closed]标准库在实践中是如何实现哈希表的? [关闭]
【发布时间】:2013-10-02 14:55:46
【问题描述】:

一些编程语言,如 python、Java 和 C++11,将哈希表(尽管有时使用不同的名称并具有扩展功能)作为其标准库的一部分。我想从高级算法的角度来理解已经实现了什么。具体来说:

  • 键的什么功能用于提供放置数据的位置(即使用的散列函数是什么)?
  • 他们使用哪些算法来解决冲突?例如,他们中是否有人使用simple chaining?
  • 是否使用随机性来选择散列函数?

【问题讨论】:

  • 你不能只看一个开源实现吗?
  • 有一个python特定的答案here。
  • @CarlNorum:我怀疑任何人都可以通过简单地阅读哈希表的源代码实现来真正理解哈希表背后的理论。
  • 对于任何感兴趣的人:这似乎是一篇相关的博客文章rcoh.me/posts/hash-map-analysis
  • @ArtemPelenitsyn 这是一个很好的链接,但没有提到随机化,我认为这是现代实现的重要组成部分。

标签: java c++ python hash language-agnostic


【解决方案1】:

对于 Java,

哈希函数本身是如何计算的?

它们由类本身实现,int hashCode()

他们使用哪些算法来解决冲突?例如,它们中的任何一个都使用简单的链接吗?

通常是简单的链接。 Java 8 将支持用于字符串冲突的树。

是否使用随机性来选择哈希函数?

不,除了避免 DOS 攻击的字符串元素/键。

【讨论】:

  • 谢谢。正在计算什么数学函数来给出放置数据的位置?我的意思是,如果键是 x,那么一个选项可能是 a*x +b mod p mod m 其中 p 是一个大素数,a 和 b 在 0 和 p-1 之间,m 是大小表的。
  • @Raphael 它不使用素数,因为% 很昂贵。相反,它使用这个函数h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4);,然后取最低位。即面具。
  • 谢谢。这很有趣。
  • @Raphael 你可能会觉得这很有趣stackoverflow.com/questions/19032197/…
猜你喜欢
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 2011-12-13
  • 1970-01-01
  • 2013-08-05
  • 2012-12-22
相关资源
最近更新 更多