在调试器中运行此代码,然后停止(我在 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
。为什么是这样?有谁知道苹果正在做什么来避免字典中的哈希冲突/对此有什么好的策略?
编辑:作为参考,这里有更多关于 NSString 散列的细节。显然,该方法只查看第一个、中间和最后 32 个字符;字符串中的其他任何内容都无关紧要。