【问题标题】:Implementing a hash function in Python在 Python 中实现哈希函数
【发布时间】:2015-02-02 17:12:16
【问题描述】:

我有一组 100,000 个 ID,我需要将其散列到一个包含 50 个存储桶的数组中。

ID 的格式为:AA00000...AA99999。我知道有像 md5 这样的函数可用,但是这些函数会生成摘要而不是数组的索引。我如何实现一个散列,以便为每个 ID 返回一个索引到我的数组中?

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

【问题讨论】:

    标签: python arrays hash


    【解决方案1】:

    只需使用内置的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)
    • 感谢 Martijn; hash() 函数会产生均匀分布吗?
    • @JoranBeasley:为什么养狗,然后自己吠,是我想知道的..
    • 我现在正在运行它,但它没有给我一个均匀的分布(甚至接近)。将每个数字乘以 7 或 31,然后将它们相加,然后使用模数来限制呢?
    • @SamTurani:啊,你看,你没有问这个。我确实相信它确实如此;我为你添加了一个直方图。
    猜你喜欢
    • 2016-03-25
    • 2016-03-05
    • 2011-01-19
    • 2016-11-12
    • 2017-05-02
    • 2010-09-06
    • 2018-07-12
    • 2010-10-13
    • 2021-07-22
    相关资源
    最近更新 更多