分布式哈希表

咱们从浅入深一步一步介绍什么是分布式哈希表。html

 

一、哈希函数数据结构

     哈希函数是一种计算方法,它能够把一个值A映射到一个特定的范围[begin, end]以内。对于一个值的集合{k1, k2, … , kN},哈希函数把他们均匀的映射到某个范围之中。这样,经过这些值就能够很快的找到与之对应的映射地址{index1, index2, … , indexN}。对于同一个值,哈希函数要能保证对这个值的运算结果老是相同的。分布式

image

     哈希函数须要通过精心设计才可以达到比较好的效果,可是老是没法达到理想的效果。多个值也许会映射到一样的地址上。这样就会产生冲突,如图中的红线所示。在设计哈希函数时要尽可能减小冲突的产生。函数

     最简单的哈希函数就是一个求余运算:  hash(A) = A % N。这样就把A这个值映射到了[0~N-1]这样一个范围之中。spa

 

二、哈希表设计

     哈希表的核心就是哈希函数hash()。htm

     哈希表是一中数据结构,它把KEY 和 VALUE用某种方式对应起来。使用hash()函数把一个KEY值映射到一个index上,即hash(KEY) = index。这样就能够把一个KEY值同某个index对应起来。而后把与这个KEY值对应的VALUE存储到index所标记的存储空间中。这样,每次想要查找KEY所对应的VALUE值时,只须要作一次hash()运算就能够找到了。blog

     举个例子:图书馆中的书会被某人借走,这样“书名”和“人名”之间就造成了KEY与VALUE的关系。假设如今有三个记录:ci

钢铁是怎样炼成的 小明
最后一天 小红
变形记 小红

      这就是“书名”和“人名”的对应关系,它表示某人借了某本书。如今咱们把这种对应关系用哈希表存储起来,它们的hash()值分别为:get

hash(钢铁是怎样炼成的) = 2
hash(最后一天) = 0
hash(变形记) = 1

      而后咱们就能够在一个表中存储“人名”了:

0 小红
1 小红
2 小明

      这三我的名分别存储在0、1和2号存储空间中。当咱们想要查找《钢铁是怎样炼成的》这本书是被谁借走的时候,只要hash()一下这个书名,就能够找到它所对应的index,为2。而后在这个表中就能够找到对应的人名了。在这里,KEY为“书名”, VALUE为“人名”。

      当有大量的KEY VALUE对应关系的数据须要存储时,这种方法就很是有效。

 

三、分布式哈希表

      哈希表把全部的东西都存储在一台机器上,当这台机器坏掉了以后,所存储的东西就所有消失了。分布式哈希表能够把一整张哈希表分红若干个不一样的部分,分别存储在不一样的机器上,这样就下降了数据所有被损坏的风险。

      分布式哈希表一般采用一致性哈希函数来对机器和数据进行统一运算。这里先不用深究一致性哈希到底是什么,只须要知道它是对机器(一般是其IP地址)和数据(一般是其KEY值)进行统一的运算,把他们全都映射到一个地址空间中。假设有一个一致性哈希函数能够把一个值映射到32bit的地址空间中,从0一直到2^32 – 1。咱们用一个圆环来表示这个地址空间。

image

      假设有N台机器,那么hash()就会把这N台机器映射到这个环的N个地方。而后咱们把整个地址空间进行一下划分,使每台机器控制一个范围的地址空间。这样,当咱们向这个系统中添加数据的时候,首先使用hash()函数计算一下这个数据的index,而后找出它所对应的地址在环中属于哪一个地址范围,咱们就能够把这个数据放到相应的机器上。这样,就把一个哈希表分布到了不一样的机器上。以下图所示:

image

      这里蓝色的圆点表示机器,红色的圆点表示某个数据通过hash()计算后所得出的地址。

      在这个图中,按照逆时针方向,每一个机器占据的地址范围为从本机器开始一直到下一个机器为止。用顺时针方向来看,每一个机器所占据的地址范围为这台机器以前的这一段地址空间。

      图中的虚线表示数据会存储在哪台机器上。

 

转自:http://www.cnblogs.com/wangshuo/archive/2011/11/26/2264404.html

相关文章
相关标签/搜索