哈希函数

哈希函数的输入输出性质

  • 输入域无穷,输出域有界
    MD5算法的输出域:返回长度为16位的字符串,每位表示16种状态->1616==264种状态 => 值的范围[0,2^64-1]
    SHA1算法的输出域:返回长度为32位的字符串,每位表示16种状态->1632==2128种状态 => 值范围[0,2^128-1]
  • 相同的输入必然会有相同的输出
    • 按一定规则计算,无随机的成分
  • 不同的输入可能会有相同的输出->哈希碰撞
    • 输入域无穷输出域有界
    • 注意:哈希碰撞是在极大量输入情况下发生,发生概率较低)
  • 不同的输入具有均匀离散性,离散型越高,哈希函数越优秀

例题

在40亿个无符号整数(范围0~2^32-1==42亿)中,使用1G内存 返回出现次数最多的数
  • hash表做法分析:
    hash表的一条记录至少需要8B key(int)-value(int),最差情况下需要40亿*8B=320亿B=32G内存, 32G > 1G,出现内存爆栈问题
  • hash函数做法分析:
    利用hash函数再取模100,得到100个分类小文件;根据均分性和输入输出一致性,统计释放每个小文件,小文件内存32G/100=0.32G < 1G,不会爆栈。

一致性哈希原理

  • 逻辑端服务器
    计算数据分配,每个实例都是等效的

  • 数据端服务器
    如何组织: 算出哈希值用模组织
    负载均衡如何计算? 看高中低频的数量
    hash的key如何选择? 选择种类多,高中低频都有数量分布的key
    弊端: 增加减少机器,数据迁移的代价是全量的
    解决: 利用哈希一致性,

  • 哈希一致性

    • 构建一个哈希环,通过逻辑端维持一个哈希值的有序数组,由机器去抢占哈希环的哈希值点去划分环,顺时针找到最近(较大于其)的机器,找到数据归属
    • 优点: 增减机器,数据迁移代价小;还可实现管理负载
    • 潜在问题: 机器很少时确保均分哈希环有一定难度; 增减机器,负载不均衡
    • 解决: 虚拟节点技术,由虚拟节点按比例强占,解决负载不均衡问题
posted @ 2021-12-08 18:30  忘川酒  阅读(127)  评论(0编辑  收藏  举报