在调试器中运行此代码并在之后停止(我在Xcode 5.0.1中的iOS 7模拟器中)。
NSString *nsStr = @"/Users/123456789012/Library/Application Support/iPhone Simulator/7.0/Applications/94F31827-6DAD-4BD5-AC91-B215176265E1/Documents/libraries/shared/17517_abPub/OEBPS/indexes/Index.sqlite";
NSString *nsStr2 = @"/Users/123456789012/Library/Application Support/iPhone Simulator/7.0/Applications/94F31827-6DAD-4BD5-AC91-B215176265E1/Documents/libraries/shared/16583_abPub/OEBPS/indexes/Index.sqlite";
NSUInteger form1 = [nsStr hash];
NSUInteger form2 = [nsStr2 hash];
NSMutableDictionary *dict = [[[NSMutableDictionary alloc]init]autorelease];
[dict setObject:@"foo" forKey:nsStr];
id foobar = [dict objectForKey:nsStr2];
请注意,form1
和form2
是相同的。我们有哈希冲突。另请注意,foobar
为nil
。哈希冲突不会使NSDictionary
失效。为什么是这样?有谁知道Apple正在做什么来在他们的字典中克服哈希冲突/一些好的策略是什么?
编辑:作为参考,here是关于NSString散列的更多细节。显然,该方法只查看第一个,中间和最后32个字符;字符串中的任何其他内容都无关紧要。
答案 0 :(得分:7)
hash
值不是唯一的。许多不同的值可以具有相同的哈希值。字典的实现知道这一点。使用散列只是优化查找的一种方法。但这是重要的实际键值,而不是哈希值。
只要返回YES
到isEqual:
的任何两个对象也具有相同的hash
,事情就可以了。
将字典视为一系列存储桶。哈希确定该值所在的桶。一旦知道了桶,您仍然需要查找确切的密钥。