objective-c – 是否每次计算[NSString哈希]?

objective-c – 是否每次计算[NSString哈希]?,第1张

概述如果我有一个不可变的字符串是每次调用哈希时运算的哈希算法,还是记住该值(给定字符串不能改变)? 重新计算 – [NSString哈希]其实是调用 – [NSCFString哈希](由于免费桥接). 如果创建一个在同一个字符串上调用[NSString hash]的程序,并且在调用之间中断并更改备份该字符串的内存,则可以获得重新计算的哈希值.这告诉我没有缓存涉及. (gdb) b -[NSCFStri 如果我有一个不可变的字符串是每次调用哈希时运算的哈希算法,还是记住该值(给定字符串不能改变)?解决方法 重新计算

– [Nsstring哈希]其实是调用 – [NSCFString哈希](由于免费桥接).

如果创建一个在同一个字符串上调用[Nsstring hash]的程序,并且在调用之间中断并更改备份该字符串的内存,则可以获得重新计算的哈希值.这告诉我没有缓存涉及.

(gdb) b -[NSCFString hash]Breakpoint 1 at 0x3b02fa3(gdb) rBreakpoint 1,0x93652fa3 in -[NSCFString hash] ()(gdb) cContinuing.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:1010      NSLog(@"Hash: %d",[m hash]);(gdb) info localspool = (NSautoreleasePool *) 0x109760m = (Nsstring *) 0x2030(gdb) x/20x 0x20300x2030 <dyld__mach_header+32>:  0xa06f54a0  0x000007c8  0x00001fa2  0x00000012

0xa06f54a0是“isa”指针,0x00001fa2是指向“XXXXXX”字符串的指针.

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

将“XXXXXX”字符串更改为“YYYYXXXX”,然后继续进行第二个哈希调用

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

注意,就ObjC知道不可变字符串而言,哈希值是不同的.

我已经(de)BUG的程序是:

#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];}
总结

以上是内存溢出为你收集整理的objective-c – 是否每次计算[NSString哈希]?全部内容,希望文章能够帮你解决objective-c – 是否每次计算[NSString哈希]?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1029289.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存