【问题标题】:How are hash collisions handled?哈希冲突如何处理?
【发布时间】:2015-04-07 10:10:34
【问题描述】:

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

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

【问题讨论】:

    标签: swift dictionary hash collision


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      有两种基本技术:

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

      或两者兼而有之。

      【讨论】:

        【解决方案3】:

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

        这里是解释一切的实际源文档的链接:https://github.com/apple/swift/blob/master/stdlib/public/core/HashedCollections.swift.gyb

        【讨论】:

          猜你喜欢
          • 2013-09-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-24
          • 2015-10-03
          • 2021-12-18
          • 2017-06-25
          • 2021-08-10
          • 1970-01-01
          相关资源
          最近更新 更多