如何处理哈希冲突?

How are hash collisions handled?

最近对哈希值有了一些了解,所以也听说了哈希冲突的问题。
因此我想知道:如何处理这些?

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

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

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

在这一点上,找出 Swift 如何处理冲突的唯一方法是反汇编库(也就是说,除非您为 Apple 工作,并且可以访问源代码)。 Curious people did that to NSDictionary, and determined that it uses linear probing,开放寻址技术的最简单变体。

有两种基本技巧:

  1. 使用不同的素数重新散列,通常是 N-2,其中 N 是原始素数,选择 N 和 N-2 都是素数。
  2. 每个哈希使用一个列表。

或两者兼而有之。

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

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