hash浅析与应用

本文中hash表和散列表为同一概念。

1.hash的概念

散列算法、哈希算法:是一种将任意长度的输入(又叫做预映射,pre-image)通过散列算法变换成固定长度输出(通常是一个较短的、固定长度的值,称为哈希值、散列值或消息摘要)的函数。这个转换过程是不可逆的,即不能从哈希值反向推导出原始的输入数据。

1.hash表/散列表

结构:

  1. 关键字(Key):散列表的查找对象,也是散列函数的参数。
  2. 散列函数(Hash Function):将关键字映射为散列表中适当存储地址的函数。这个函数是散列表的核心,决定了如何将关键字转换为存储地址。
  3. 散列地址(Hash Address):将关键字通过散列函数计算出的地址,也称为散列值或哈希值。
    关系:
    key(键)和要查询的数据(通常称为value或值)之间存在一种映射关系。这种关系是通过哈希函数(Hash Function)来建立的,但直接来说,它们之间的关系是:
  • Key(键):是用于唯一标识或定位数据的标识符。当你想要存储、检索或修改散列表中的某个数据时,你会使用这个键来找到对应的数据。
  • Value(值):是与键相关联的数据本身。这个值可以是任何类型的数据,如数字、字符串、对象等,具体取决于散列表的应用场景和设计。

2.冲突及解决方法:

因为其输出为较短且固定长度的值,所以在面对海量数据时候会有冲突的情况发生,所以必须有解决冲突的方法:
方法1:开放寻址法:当遇到冲突的时候,按照某种算法确定下一个存储位置继续计算,如果位置是空就存储,不为空就重复。
★方法2:拉链法//散列表:使用最广泛的最经典的方法,将所有冲突的值都存储在同一个索引的链表中。
方法3:再hash:如果第一个hash冲突就调用第二个hash继续算,如果冲突就继续算。

3.hash函数:

murmurhash1,murmurhash2,murmurhash3,siphash
测试地址:https://github.com/aappleby/smhasher

负载因子:数组存储个数/数组长度,描述存储密度,冲突概率

STL容器 map\set\multimap\multiset 底层都是红黑树
unordered_*(map\set\multimap\multiset )底层都是散列表,但是他们底层解决冲突的方法不一定都是拉链法,这里需要详细研究代码。

布隆过滤器:

布隆过滤器(Bloom Filter)是一种高效的数据结构,主要用于快速检查一个元素是否属于某个集合中。

特点是:高效插入和查询,可以确定某字符串是否一定不存在或者可能存在,可能存在的概率是可以控的。

使用场景:

缓存穿透问题 爬虫 热key限流 大数据去重 网络安全匹配

布隆过滤器关键数值

布隆过滤器的大小/位图占空间的大小(m)、哈希函数的个数(k)、误判率(p)、预期布隆过滤器中元素个数(n)
n = ceil(m / (-k / log(1 - exp(log§ / k))))
p = pow(1 - exp(-k / (m / n)), k)
m = ceil((n * log§) / log(1 / pow(2, log(2))));
k = round((m / n) * log(2));
在线计算网站:https://hur.st/bloomfilter/

分布式一致性hash:

解决缓存服务器数量变化尽量不影响缓存失效;
问题1:hash偏移
问题1描述:hash 算法得到的结果是随机的,不能保证服务器节点均匀分布在哈希环上;分布不均造成请求访问不均匀,服务器承受的压力不均匀;
hash偏移
解决方法1:增加虚拟节点
hash环节点越多数据分布越均衡,可以通过为每个服务器节点计算多个hash节点。
hash(“IP:PORT:seqno”)%2^32
增加虚拟节点后

hash数据筛选 例子:

怎么使用2GB内存从20亿个数中找到出现次数最多的数
通过使用散列表。拉链法统计。

key整数–4字节
最坏情况时20亿个相同的整数,那么value次数需要uint32 4字节存储
20亿一共需要16G内存(8字节*20亿)
所以需要拆分数据,将数据源拆分。
两种思路:
方法1.先拆分,然后分别hash统计,通过散列表计数,拆分的文件全部算完后统计到一个整的散列表中(空间不足,需要在磁盘操作)然后获得最多的技术。
方法2.先逐项读取20亿数计算hash,通过hash分流到若干个小文件中,依次统计小文件中的整数出现次数,最后综合比较全局最大值。

https://github.com/0voice

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值