hashmap
java 中的 hashmap 冲突处理方法采用的是 链地址法
(hash 冲突解决法:开发定址法:(线性探测再散列,伪随机探测再散列,平方探测再散列)
再哈希法,链地址法,建立公共溢出区)
初始长度为16,自动扩展或者手动初始化是,长度必须是2的幂(减少冲突,只要hashcode本身分布均匀,算法结果就是均匀的)
取模的时候&(len-1)。
布隆算法
为了解决hashcode 算法占用内存太大的算法。
结合bitmap算法,将整个字符串分成m部分,(每一部分都取得一个hash值,然后判断只有当这m个值都是1的时候,才判定发生冲突)。针对邮箱地址来说,为了减少误判,可以添加信任邮箱白名单。
应用:爬虫大量url排序,垃圾邮箱地址的过滤。
bitmap算法
位示图法
解决冲突,mysql 表中采用一个标签对用多个用户的存储方式
交 | 或 运算因为是位运算,所以比较快。
要想支持非运算,可以维护一个全量用户,然后取非时采用异或操作。
谷歌EWAHCompressedBitmap ,存储数据到long数组中,
谷歌把这些子集叫word,随着数据的不断插入,word量会随之扩充。
跨度信息简称RLW, 用于存储跨度信息的word,简称LW。
LW的低32为表示横跨了多少空word,高32为当前RLW后方有多少个连续
的LW。在RLW中插入数值的时候,会涉及部分word的移位。影响性能,所以
谷歌官方建议使用者从小到大来插入数据。