哈希冲突是如何处理的?

时间:2015-02-07 07:43:00

标签: swift dictionary hash collision

我最近学到了一些关于哈希值的知识,因此也听说过哈希冲突的问题。
因此,我想知道:如何处理这些问题?

E.g。 Swift的Dictonary使用哈希值及其键。我假设它通过哈希查找其值。那么,Swift的Dictionary如何为不同的密钥存储值,这些密钥恰好具有相同的哈希值?

3 个答案:

答案 0 :(得分:4)

从根本上说,有两种主要的处理哈希冲突的方法 - 单独链接,当具有冲突哈希码的项目存储在单独的数据结构中时,以及开放寻址,当碰撞数据存储在使用某种算法选择的另一个可用存储桶中时。

这两种策略都有许多子策略,described in Wikipedia。特定实现所使用的确切策略毫不奇怪地是特定于实现的,因此作者可以随时更改它以获得更高效的内容而不会破坏其用户的假设。

在这一点上,了解Swift如何处理冲突的唯一方法是反汇编库(即除非你为Apple工作,并且可以访问源代码)。 Curious people did that to NSDictionary,并确定它使用linear probing,这是开放寻址技术的最简单变体。

答案 1 :(得分:0)

有两种基本技术:

  1. 使用不同的素数进行Rehash,通常是N = 2,其中N是原始素数,选择N和N-2都是素数。
  2. 每个哈希使用一个列表。
  3. 或两者兼而有之。

答案 2 :(得分:0)

Swift词典使用开放式寻址和线性探测。

以下是解释所有内容的实际源文档的链接:https://github.com/apple/swift/blob/master/stdlib/public/core/HashedCollections.swift.gyb