【发布时间】:2015-02-02 17:12:16
【问题描述】:
我有一组 100,000 个 ID,我需要将其散列到一个包含 50 个存储桶的数组中。
ID 的格式为:AA00000...AA99999。我知道有像 md5 这样的函数可用,但是这些函数会生成摘要而不是数组的索引。我如何实现一个散列,以便为每个 ID 返回一个索引到我的数组中?
提前致谢。 (在 Python 中实现)
【问题讨论】:
我有一组 100,000 个 ID,我需要将其散列到一个包含 50 个存储桶的数组中。
ID 的格式为:AA00000...AA99999。我知道有像 md5 这样的函数可用,但是这些函数会生成摘要而不是数组的索引。我如何实现一个散列,以便为每个 ID 返回一个索引到我的数组中?
提前致谢。 (在 Python 中实现)
【问题讨论】:
只需使用内置的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: *************************************************
【讨论】:
reduce(operator.xor,map(ord,my_string)) % 50 :P (+1)