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?
Antwort
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];
}
ehrfürchtige Antwort. Danke – Ian1971
Sehr nette Antwort –
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. –
- 1. IAuthorizationFilter wird nicht jedes Mal aufgerufen
- 2. Chrome Prerender-Funktion wird jedes Mal abgebrochen
- 3. Inkrementieren jedes Mal, wenn Skript ausgeführt wird
- 4. Ereignissignal wird jedes Mal zweimal ausgegeben
- 5. Broadcast-Empfänger wird nicht jedes Mal aufgerufen
- 6. Der Dialog wird jedes Mal angezeigt?
- 7. SharedPreferences wird zurückgesetzt, jedes Mal die App
- 8. -Code leer jedes Mal
- 9. viewDidLoad lädt jedes Mal
- 10. PHP password_hash jedes Mal
- 11. Jedes Mal, wenn die Schaltfläche geklickt wird, wird MVVM verwendet.
- 12. Console.SetWindowPosition -> zentriert (jedes Mal)
- 13. Docker Bildschichten reuploaded jedes Mal
- 14. Zufallszahl jedes Mal/jeden Tag
- 15. Logstash jedes Mal wirft _grokparsefailure
- 16. Combobox Change-Ereignis wird jedes Mal in Excel VBA
- 17. Aktivität erhöht RAM verwenden jedes Mal, wenn es gestartet wird
- 18. Xcode wird unerwartet beendet, jedes Mal wenn ich Xcode öffnen
- 19. Javascript Regular Expression nicht jedes anderes Mal aufgerufen wird
- 20. Wird path.getragomfilename jedes Mal einen eindeutigen Dateinamen erzeugen?
- 21. Einen Cronjob jedes Mal anpassen, wenn er ausgeführt wird?
- 22. Namensschild, das sich jedes Mal überschneidet, wenn es geladen wird
- 23. Wird ConfigurationManager.AppSettings [Key] jedes Mal aus der Datei "web.config" gelesen?
- 24. Warum wird das Spaltennamensbanner von GetType() nicht jedes Mal angezeigt
- 25. Zufällige Farbe jedes Mal, wenn auf die Schaltfläche geklickt wird
- 26. Versuche, Durchschnitt jedes Mal, wenn etwas hinzugefügt wird
- 27. Tabfragment wird jedes Mal neu geladen ich die Registerkarte
- 28. Wird der After_validation-Hook jedes Mal bei Active Record aufgerufen?
- 29. FirstAppear wird nicht funktionieren, ViewController init jedes Mal
- 30. Wird der genetische Algorithmus jedes Mal unterschiedliche Ausgaben liefern?
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. –
Vielleicht war ich interessiert? – Ian1971