Objective-C中的'hash'方法做了什么

max*_*ax_ 6 hash cocoa-touch objective-c

偶尔,当我向下看一个对象响应的选择器列表时,我看到hash了.有一段时间了,我想知道这意味着什么,但我从来没有找到过.

如果您能告诉我选择器的作用以及这样做的常见用途,我将非常感激.

Ali*_*are 8

它计算对象的哈希值,这在HashTables中特别有用,比如将对象用作对象的键NSDictionary.

对象hash必须具有以下属性:

  • 要被视为相同的两个相同类的对象应返回相同的哈希
  • 具有不同散列的两个对象永远不会被视为相等
  • 具有相同散列的两个对象不必彼此相等; 无论如何,散列越独特,NSDictionary查找的性能就越好.
  • 如果还应尽可能快地计算,以避免字典中的性能问题

有关更多信息,请阅读hash定义 此方法的NSObject协议文档.


例如,hash字符串的函数可以是此字符串的字符数,或其字符的ascii代码的总和,或类似的任何内容.

当你搜索一个给定的密钥时NSDictionary,一个解决方案是将搜索到的密钥与字典中的所有其他密钥进行比较,这需要循环通过所有密钥并调用isEqual每个密钥,这将花费很长时间,如果这本词典有很多条目.因此,Cocoa将计算搜索到的键的哈希值,并将其与字典中键的所有(预先计算的)哈希值进行比较.

这样更有效,因为它只需要在NSUInteger值之间进行比较,即使NSDictionaryNSStrings或其他对象的键,所以这真的更快.一旦找到与搜索到的密钥的哈希具有相同哈希的密钥,它就可以通过这个哈希循环所有密钥,并通过调用将它们与搜索到的密钥进行比较isEqual,但是在这个阶段将会有更少的密钥循环直播(如果密钥的散列真的是唯一的,甚至可能只有一个)

  • 像[NSDictionary`这样的[哈希表](http://en.wikipedia.org/wiki/Hash_table)数据结构通常不会将密钥与它存储的每个密钥的哈希值进行比较.散列通常用作存储桶数组的直接索引,这些存储桶包含具有相同散列(或散列范围,取决于存储桶数量)的对象链. (4认同)