2009-05-13 10 views
13

Wenn ich eine unveränderliche Zeichenfolge habe, wird der Hashing-Algorithmus jedes Mal ausgeführt, wenn ich einen Hash aufruft, oder erinnert er sich an den Wert (vorausgesetzt, dass sich die Zeichenfolge nicht ändern kann)?Wird [NSString-Hash] jedes Mal berechnet?

+1

Gut mit einer anderen Frage zu beantworten, warum fragst du? Wenn Sie sich Sorgen um die Leistung machen, dann machen Sie sich offensichtlich zu früh Sorgen, da Sie keinen Code zum Profil haben und dies selbst herausfinden können. Wenn Apple dieses Verhalten nicht dokumentiert, könnte es sich in der Zukunft durchaus ändern, also sollten Sie sich nicht darauf verlassen. –

+18

Vielleicht war ich interessiert? – Ian1971

Antwort

36

Es ist neu berechnet.

- [NSString-Hash] ist in der Tat ein Aufruf an - [NSCFString-Hash] (wegen gebührenfreier Überbrückung).

Wenn Sie ein Programm erstellen, das - [NSString hash] in derselben Zeichenfolge aufruft und zwischen den Aufrufen unterbricht und den Speicher für die Sicherung ändert, erhalten Sie einen neu berechneten Hashwert. Das sagt mir, dass es kein Caching gibt.

(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 

Beachten Sie den Hashwert.

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 ist die "isa" Zeiger, 0x00001fa2 ein Zeiger auf die "xxxxxx" Zeichenfolge ist.

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

die "XXXXXX" string ändern, um "YYYYXXXX", dann auf den zweiten Hash-Aufruf weiterhin

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

Hinweis des Hash-Wert, der als ganz anders auf dem als ObjC unveränderliche Zeichenfolge kennt.

Das Programm Ich habe (de) abgehört ist:

#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

ehrfürchtige Antwort. Danke – Ian1971

+0

Sehr nette Antwort –

+11

Alternativ können Sie den Quellcode für CFStringRef hier anschauen: http://opensource.apple.com/source/CF/CF-476.17/CFString.c Suche nach 'CFHashCode __CFStringHash (CFTypeRef cf) 'für die Funktion, die aufgerufen wird. Beachten Sie, dass es (a) bei Bit- und Unicode-Zeichenfolgenpuffern andere Dinge macht und (b) nur bis zu einer bestimmten Anzahl von Zeichen (derzeit 96) hasht. Suchen Sie nach '/ * String hashing:', um die Details des Hashing-Algorithmus (s) zu sehen. –

Verwandte Themen