本文共 1602 字,大约阅读时间需要 5 分钟。
从哈希值不能反向推导出原始数据 原始数据只修改了一个 Bit,新得到哈希值与原哈希值也应该大不相同 散列冲突的概率要很小,即不同的原始数据,映射得到的哈希值相同的概率要非常小 哈希算法的执行效率要尽量高效,要快速地计算出哈希值 举例: MD5("我今天讲哈希算法!") = 425f0d5a917188d2c3c3dc85b5e4f2cb MD5("我今天讲哈希算法") = a1fb91ac128e6aa37fe42c663971ac3d // 哈希值长度一致,原始数据相差小,哈希值完全不同 MD5(一篇4000字文章),也能很快得到哈希值
哈希值长度越大,哈希冲突的概率越小,但可能加密时间越长,需要做一个平衡
图片搜索中,不能依靠图片名称搜索,原始的方案是,用图片的二进制码串和图库的所有图片码串进行一一对比,但码串可能非常大,比对效率很低;
为此,可以给每个图片生成一个信息摘要,即唯一标识,如将图片码串,取前100字节,中间100字节,尾部100字节,然后通过哈希算法,生成一个哈希串,作为唯一标识,图片搜索时,先比对唯一标识,只有当唯一标识匹配时,再进行全量比对来确认是否完全一致;
为加快搜索效率,可以将图片唯一标识,和图片在图库路径,存放在散列表中,这样查找效率高
如果负载均衡策略是会话粘滞,就可以通过哈希算法,对客户端 IP 地址或者会话 ID 计算哈希值,将哈希值与服务器列表的大小进行取模运算,得到的值就是应该被路由到的服务器编号;
这种方案,比起维护一张 ip 地址和服务器地址的列表,进行查找更方便,尤其在面临服务器上下线的场景;
如 1 亿张图片,将其哈希值和路径,存放在散列表,单台机器内存不够,需要进行分片,可以根据哈希值对机器个数求模取 余,表示要存放的机器
当数据进行分布式存储后,节点扩缩容,都涉及数据的搬移,如果单纯的哈希取余,节点上线,会有大量数据需要重新映射,为此引入一致性哈希,是指将数据的最小哈希值和最大哈希值,划分为多个小区间,每个节点维护一部分区间,这样节点上下线,数据映射不会大量改变;
一致性哈希,借助虚拟环和虚拟节点,
用户密码的存储,可以通过哈希算法 SHA 进行加密后存储,不过如果是简单密码,生成的哈希值,很容易被猜到,因此,可以在用户密码的基础上,加盐后进行 SHA 加密;
分块 ( 索引 ) 查找,要求块间是有序的,即一个块中的元素,都要比另一个块中元素,大或者小,首先将每个块中最大值,和对应的起始位置,组成一个有序序列,然后通过二分查找,确定元素所在的块,最后在块内,进行顺序查找;
排序二叉树,查找元素,时间复杂度 O(h),h 是树的最大高度,对于平衡二叉树,h = log2N,查找过程,从根元素开始,每次确定左边,或者右边,进行查找;
哈希表,查找元素,时间复杂度,O(1),因为元素的存储位置,和元素值直接相关;
转载地址:http://qsfin.baihongyu.com/