2009-05-13 16 views
13

यदि मेरे पास एक अपरिवर्तनीय स्ट्रिंग है तो हैशिंग एल्गोरिदम हर बार जब मैं हैश कहता हूं, या क्या यह मान याद करता है (यह देखते हुए कि स्ट्रिंग बदल नहीं सकती है)?क्या [एनएसएसटींग हैश] हर बार गणना की जाती है?

+1

ठीक है, एक और सवाल के साथ जवाब देने के लिए तुम क्यों परवाह करते हैं? यदि आप प्रदर्शन के बारे में चिंतित हैं, तो आप बहुत जल्द ही चिंता कर रहे हैं क्योंकि आपके पास प्रोफ़ाइल के लिए कोई कोड नहीं है और इसे स्वयं के लिए खोजा गया है। इसके अलावा, अगर ऐप्पल इस व्यवहार को दस्तावेज नहीं करता है, तो यह भविष्य में काफी खुशी से बदल सकता है, इसलिए आपको उस पर भरोसा नहीं करना चाहिए। –

+18

शायद मुझे दिलचस्पी थी? – Ian1971

उत्तर

36

यह पुन: संकलित है।

- [एनएसएसटींग हैश] वास्तव में एक कॉल है - [एनएससीएफस्ट्रिंग हैश] (टोल फ्री ब्रिजिंग के कारण)।

यदि आप एक प्रोग्राम बनाते हैं जो एक ही स्ट्रिंग पर - [एनएसएसटींग हैश] को कॉल करता है और आप कॉल के बीच में टूट जाते हैं और स्ट्रिंग का बैक अप लेते हुए स्मृति को बदलते हैं, तो आपको एक पुन: गणना हैश मान मिलता है। यह मुझे बताता है कि इसमें कोई कैशिंग शामिल नहीं है।

(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" स्ट्रिंग के लिए एक सूचक है।

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

"XXXXXX" स्ट्रिंग को बदलने "YYYYXXXX", तो दूसरी हैश कॉल

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

नोट हैश मान होता है पर अलग है जहाँ तक ObjC अपरिवर्तनीय स्ट्रिंग जानता है के लिए जारी रखने के लिए।

कार्यक्रम मैं गए हैं (डी) bugged है:

#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) के लिए खोजें 'समारोह के लिए कहा जाता है। ध्यान दें कि यह (ए) 8-बिट और यूनिकोड स्ट्रिंग बफर के लिए चीजें अलग-अलग करता है, और (बी) केवल कुछ निश्चित वर्णों (वर्तमान में 96) तक पहुंच जाता है। हैशिंग एल्गोरिदम के विवरण देखने के लिए '/ * स्ट्रिंग हैशिंग:' के लिए खोजें। –

संबंधित मुद्दे