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

时间:2011-10-01 16:51:30

标签: objective-c cocoa-touch hash

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

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

2 个答案:

答案 0 :(得分:8)

它计算对象的哈希值,这在HashTables中特别有用,例如当对象用作NSDictionary的键时。

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

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

有关详细信息,请read the NSObject Protocol documentation定义此hash方法。


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

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

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

答案 1 :(得分:0)

它用于在关联数组数据类型中实现高效的hash tables,例如NSDictionary