NSString哈希冲突不会搞乱NSDictionary

时间:2013-10-09 20:14:06

标签: ios objective-c hash nsdictionary

在调试器中运行此代码并在之后停止(我在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];

请注意,form1form2是相同的。我们有哈希冲突。另请注意,foobarnil。哈希冲突不会使NSDictionary失效。为什么是这样?有谁知道Apple正在做什么来在他们的字典中克服哈希冲突/一些好的策略是什么?

编辑:作为参考,here是关于NSString散列的更多细节。显然,该方法只查看第一个,中间和最后32个字符;字符串中的任何其他内容都无关紧要。

1 个答案:

答案 0 :(得分:7)

hash值不是唯一的。许多不同的值可以具有相同的哈希值。字典的实现知道这一点。使用散列只是优化查找的一种方法。但这是重要的实际键值,而不是哈希值。

只要返回YESisEqual:的任何两个对象也具有相同的hash,事情就可以了。

将字典视为一系列存储桶。哈希确定该值所在的桶。一旦知道了桶,您仍然需要查找确切的密钥。