hash算法设计基础

Hash

称散列、哈希,基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出。这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值。开发中经常使用的MD5和SHA都是历史悠久的Hash算法。

hash算法必备

  • 从hash值不可以反向推导出原始的数据
  • 经过映射后的数据和原始数据没有对应关系
  • 输入数据的微小变化会得到完全不同的hash值,相同的数据会得到相同的值
  • 可以看到我们只改了一个文字,但是整个得到的hash值产生了非常大的变化。
  • 哈希算法的执行效率要高效,长的文本也能快速地计算出哈希值
  • hash算法的冲突概率要小

由于hash的原理是将输入空间的值映射成hash空间内,而hash值的空间远小于输入的空间。根据抽屉原理,一定会存在不同的输入被映射成相同输出的情况。那么作为一个好的hash算法,就需要这种冲突的概率尽可能小。

hash算法是一定会有冲突的


Hash算法原理

  • 一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希空间环如下:
  • 整个空间按顺时针方向组织。0到2的32次方减1,即:2^{32} -1,在零点中方向重合。

一致性hash算法

  • 一致性hash算法,是麻省理工学院1997年提出的一种算法,目前主要应用于分布式缓存当中。
  • 一致性hash算法可以有效地解决分布式存储结构下动态增加和删除节点所带来的问题。
  • 在Memcached、Key-Value Store、Bittorrent DHT、LVS中都采用了一致性hash算法,可以说一致性hash算法是分布式系统负载均衡的首选算法。
  • 解决一致性hash的负载不均问题,也可以利用虚拟层的概念,将每台物理缓存服务器虚拟成一组虚拟缓存服务器,再将虚拟的hash值放在hash环上。每次查询时,先找到虚拟的缓存服务器key值,再通过该值找到物理服务器信息。

这样新加入缓存服务器时,是加入一组虚拟服务器,如果数量足够多的话,这个新加入的缓存服务器会均匀的影响原有的缓存服务器。

实际工作中,当数据表超过500万条或更多时,一般就会考虑到采用分库分表;

系统使用了一台缓存服务器还是不能满足的时候,通常会使用多台缓存服务器,需要考虑如何去访问背后的库表或缓存服务器呢,我们会在存取的时候使用相同的哈希算法定位到具体的位置。

hash算法设计基础


分享到:


相關文章: