哈希表(Hash table,也叫散列表),是根据关键码值而直接进行访问的数据结构,是一块连续的存储空间。
记录的存储位置=f(关键字)
这里的对应关系f称为哈希函数(散列函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。所以哈希表的关键就是哈希函数。
1.不能通过哈希值反推到原始数据
2.对关键字敏感,即使关键字只有微小的不同,哈希值也会很不一样
3.冲突小,即针对不同的关键字,生成的哈希值相同的概率小
4.执行效率高,对于大量的访问哈希表的数据,也需要很快的计算出对应表中的位置
1.直接定址法:哈希函数为线性函数,eg: f(k)=ak+b,a和b为常数
2.平方取中法:将关键字平方以后取中间几位
3.折叠法:先按照一定规则拆分再组合,例如书的索引ISBN 978-7-121-33637-9,可以拆合为97+87+12+13+36+37+9=291,哈希值为291
4.取余:f(k)=k%n,假设哈希表的长度为m,则n一般为不超过m的最大质数,用于关键字位数较多,并且关键字中每一位上数字分布大致均匀。
5.随机数法:选择一个随机函数,把关键字的随机函数值作为它的哈希值。通常当关键字的长度不等时用这种方法。
冲突就是对于不同的关键字,经过哈希函数计算以后的哈希值相同。
解决冲突的常用方法: 1.开放定址法:使用某种探查(亦称探测)技术在散列表中寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到。
2.链地址法:哈希值相同的数据放在同一线性链表中
例如下面图上对需要储存的数据%11,那么12、23、34取余结果都一样是1,则采用链表的结构放在地址为1的空间,查找的时候通过哈希函数找到地址是1的链表,向后查找即可
NSDictionary
1.使用 hash表来实现key和value之间的映射和存储
2.字典的key需要遵循NSCopying协议,重写hash和isEqual方法,如果不重写,hash方法默认返回对象的地址,两个值相同的对象地址不同在存储过程中会生成两个key,取值的时候调用isEqual也是通过地址判断,地址不同会取不到值。
3.NSString类作为key的时候不需要重写,系统已经重写过了,对于值相同的字符串得到的哈希值相同
runloop
kvo
weak指针
全局HashMap,用来储存某个对象的所有weak指针,key是所指对象的指针,value是weak指针的地址数组(一个对象可能被多个指针指向)
objc_clear_deallocating该函数的动作如下:
1、从weak表中获取废弃对象的地址为键值的记录
2、将包含在记录中的所有附有 weak修饰符变量的地址,赋值为nil
3、将weak表中该记录删除
4、从引用计数表中删除废弃对象的地址为键值的记录
APP签名,MD5加密
作者:Olivia_S 链接:https://www.jianshu.com/p/48709f466db9 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。