2009-05-13 6 views
13

不変の文字列がある場合は、ハッシュを呼び出すたびに実行されるハッシングアルゴリズムですか?(文字列が変更できないので)値を記憶していますか?[NSString hash]は毎回計算されますか?

+1

さて、なぜあなたは気にしない、別の質問に答えるために?あなたがパフォーマンスについて心配しているなら、プロファイルを作成して自分で見つけ出すコードがないので、あまりにも早く心配していることになります。さらに、Appleがこの動作を記録していないと、将来的にはうれしく変わる可能性があるので、それに頼るべきではありません。 –

+18

おそらく私は興味がありましたか? – Ian1971

答えて

36

再計算されます。

- [NSStringハッシュ]は、実際には - [NSCFStringハッシュ](フリーダイヤルによるブリッジ)の呼び出しです。

同じ文字列で - [NSString hash]を呼び出すプログラムを作成し、呼び出し間に侵入して文字列をバックアップするメモリを変更すると、再計算されたハッシュ値が得られます。これはキャッシングがないことを示しています。

(gdb) b -[NSCFString hash] 
Breakpoint 1 at 0x3b02fa3 
(gdb) r 
Breakpoint 1, 0x93652fa3 in -[NSCFString hash]() 
(gdb) c 
Continuing. 
2009-05-13 14:23:39.003 a.out[1754:813] Hash: -327163326 

ハッシュ値に注意してください。

Breakpoint 1, 0x93652fa3 in -[NSCFString hash]() 
(gdb) bt   
#0 0x93652fa3 in -[NSCFString hash]() 
#1 0x00001f73 in main() at test.m:10 
(gdb) fra 1 
#1 0x00001f73 in main() at test.m:10 
10  NSLog(@"Hash: %d", [m hash]); 
(gdb) info locals 
pool = (NSAutoreleasePool *) 0x109760 
m = (NSString *) 0x2030 
(gdb) x/20x 0x2030 
0x2030 <dyld__mach_header+32>: 0xa06f54a0 0x000007c8 0x00001fa2 0x00000012 

0xa06f54a0 0x00001fa2が "XXXXXX" の文字列へのポインタである、 "ISA" ポインタです。

(gdb) set {int}0x1fa2 = 0x59595959 

第2のハッシュ呼び出し

(gdb) c 
Continuing. 
2009-05-13 14:24:35.884 a.out[1754:813] Hash: -246144954 

注限りにObjCは不変の文字列を知っているようで異なるハッシュ値に進み、その後、「YYYYXXXX」に「XXXXXX」の文字列を変更します。

私は(デ)盗聴したプログラムは以下のとおりです。

#import <Cocoa/Cocoa.h> 

int main() 
{ 
    NSAutoreleasePool * pool = [NSAutoreleasePool new]; 

    NSString * m = [NSString stringWithString:@"XXXXXXXXXXXXXXXXXX"]; 

    NSLog(@"Hash: %d", [m hash]); 
    NSLog(@"Hash: %d", [m hash]); 

    [pool release]; 
} 
+0

素晴らしい答え。ありがとうございました – Ian1971

+0

非常に良い回答 –

+11

また、CFStringRefのソースコードをここで見ることができます:http://opensource.apple.com/source/CF/CF-476.17/CFString.c 'CFHashCode __CFStringHash(CFTypeRef cf) '関数が呼び出されます。 (a)8ビットとUnicodeの文字列バッファでは処理が異なりますが、(b)特定の文字数(現在は96文字)までハッシュされていることに注意してください。ハッシュアルゴリズムの詳細を表示するには、 '/ * String hashing:'を検索してください。 –

関連する問題