Swift:为啥字典中的键类型必须是 Hashable 类型 [重复]

Posted

技术标签:

【中文标题】Swift:为啥字典中的键类型必须是 Hashable 类型 [重复]【英文标题】:Swift : Why is it required for the key type in a Dictionary to be of type Hashable [duplicate]Swift:为什么字典中的键类型必须是 Hashable 类型 [重复] 【发布时间】:2018-05-01 14:24:21 【问题描述】:

如果我想创建一个Dictionary<Key:Value>(),则需要Key 类型对象到协议Hashable。为什么会这样,字典是如何实现的?

我的意思是我会理解,如果Key 只需要符合Equatable 类型的协议,因为程序将不得不搜索相关值,但是,额外的var hashValue: Int 随之而来Hashable 有点混乱

【问题讨论】:

提示:字典是一个哈希映射。 这不是一个 Swift 问题,而是一个一般的编程问题。根据定义,字典是一种数据结构,它使用键的哈希值来定位它们的值。 @rmaddy 更有意义 :-) 为什么他们称它为字典?应该称它为类似于 Java 的 HashMap @BallpointBen 字典(通用计算数据结构,也称为关联数组)不需要使用哈希来查找值,它比那个更通用。字典是键值对的集合,您只需拥有适当的键即可使用它们来存储和查找值。哈希部分是一种优化,通过将字典实现为哈希映射来提供更快的查找时间。它可以很容易地成为一个搜索树型结构。 而“搜索树型结构”将要求元素为 Comparable 而不是 Hashable。每个都有其权衡。 OP:如果您正在寻找使用 Equatable 键的关联数据类型,请参阅 DictionaryLiteral,它基本上只是 Array<(Key: Equatable, Value)> 的包装器 【参考方案1】:

可散列键使字典插入和查找更加高效,尤其是对于大型字典。

如果键不可散列,为了找到特定键,您必须(在最坏的情况下)读取并比较字典中的所有键是否相等。

可哈希键自然会根据其哈希值划分为桶,要找到特定的键,您需要计算其哈希以确定它所在的桶,然后您只需比较属于同一桶的相等键即可。如果正确选择了哈希函数并且字典中的元素数量小于最大 Int 值,那么您很有可能每个桶只有一个键,从而使查找效率与 O(1) .

this related question有更多信息。

【讨论】:

以上是关于Swift:为啥字典中的键类型必须是 Hashable 类型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Swift 学习- 05 -- 集合类型

swift资源库—3—字典/集合/数组

字典知识总结

在 Swift 中,我可以使用元组作为字典中的键吗?

好好学python · 字典

在iOS9 swift中的字典类型中添加数组作为键和值