ShowHash 用于测试和展示 hash 算法在值区间里是否分布比较均衡。同时可以显示一个指定的 KEY 在经过 hash 后被散列到了值区间的相对位置
有了 showhash 可以在应用一致性 hash 的分布式系统中方便的确定节点服务的 KEY。
[nobugtodebug@localhost ~]$ ./ShowHash
得到类似以下的输出结果:
[100 %] CalculateHash finished.
****************************************************************************************************
****************************************************************************************************
****************************************************************************************************
****************************************************************************************************
****************************************************************************************************
****************************************************************************************************
****************************************************************************************************
****************************************************************************************************
****************************************************************************************************
****************************************************************************************************
****************************************************************************************************
****************************************************************************************************
*************************************************** ************************************************
*************** ****************** ******** ****** ******************** ******* * * ***************
**** * ******** * *** * ******* * ** ** ****** **** ** * ** ** ***** * * * * ** *** * **
** * * * ** * ** * ** * * * ** * * * * ** * * * * ***
* * * * * * * ** *
*
----------------------------------------------------------------------------------------------------->
上面的输出显示 Hash 值在值区间的分布情况。
只要修改 hash.py 文件。hash.py必须提供如下两个方法:
def MaxValue():
'''返回整数表示的hash算法的最大取值'''
return 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
def Sum(key):
'''计算 hash 并返回大整数表示的 hash 值'''
m = hashlib.md5()
m.update(key)
hashvalue = m.hexdigest()
return eval("0x"+hashvalue), hashvalue
Sum() 方法的参数 key 是byte[]. 经过 hash 后返回大整数表示的 hash 结果和字符串表示的结果,字符串结果是为了方便调试显示用的。
修改 ShowHash.py 文件的如下变量和方法:
# 哈希值在分布轴上显示的粒度,既多少个值显示成一个点
GRANULARITY = 10
def PrepareKey():
'''产生并返回待测试的 key list'''
return range(0, 14500)
- PrepareKey 方法返回一个 list,该 list 可以是一系列的数值,也可以是字符串。如果混合两者在一起也没有问题。
- GRANULARITY 表示在特定区域内多少个结果值合并成一个点来输出。该变量的取值应该和PrepareKey 方法返回的列表大小正相交。即列表长,取值就应该大;列表短,取值就应该小一点。
很简单!
- 在确定了一致性 hash 算法后,用 hash.py 实现你的 hash 算法。(对于 C 开发的程序,可以直接调用 c模块;其他语言的程序可以尝试将你的算法包装成 http等服务,在 hash.py 指定的两个方法中调用即可)
- 指定 PrepareKey 只包含你准备尝试的 key. 同时将 GRANULARITY 设置为 1。