在Python中实现哈希函数

时间:2014-12-04 17:43:38

标签: python arrays hash

我有一组100,000个ID,我需要哈希到一个有50个桶的数组中。

ID的格式为:AA00000 ... AA99999。我知道有像md5这样的函数可用,但那些产生的摘要不是索引到数组中。我怎么能实现一个哈希,这样对于每个ID,它都会将索引返回到我的数组中?

提前致谢。 (在Python中实现)

1 个答案:

答案 0 :(得分:2)

只需使用内置hash() function,并使用模数将结果限制为50:

hash(yourid) % 50

来自文档:

  

返回对象的哈希值(如果有)。哈希值是整数。

对于您的给定输入,这将统一

>>> from collections import Counter
>>> histogram = Counter(hash('AA{:05d}'.format(i)) % 50 for i in range(100000))
>>> for i in range(50):
...     print '{:4d}: {}'.format(histogram[i], '*' * (histogram[i] // 40))
... 
1932: ************************************************
1932: ************************************************
1941: ************************************************
1941: ************************************************
1908: ***********************************************
1908: ***********************************************
1974: *************************************************
1974: *************************************************
2012: **************************************************
2012: **************************************************
1898: ***********************************************
1898: ***********************************************
1954: ************************************************
1954: ************************************************
1925: ************************************************
1925: ************************************************
1995: *************************************************
1995: *************************************************
1982: *************************************************
1982: *************************************************
2023: **************************************************
2023: **************************************************
2025: **************************************************
2025: **************************************************
2070: ***************************************************
2070: ***************************************************
2042: ***************************************************
2042: ***************************************************
2028: **************************************************
2028: **************************************************
2120: *****************************************************
2120: *****************************************************
2064: ***************************************************
2064: ***************************************************
2100: ****************************************************
2100: ****************************************************
2057: ***************************************************
2057: ***************************************************
2039: **************************************************
2039: **************************************************
1981: *************************************************
1981: *************************************************
1956: ************************************************
1956: ************************************************
2000: **************************************************
2000: **************************************************
1982: *************************************************
1982: *************************************************
1992: *************************************************
1992: *************************************************