Python便携式哈希

时间:2015-01-03 18:52:50

标签: python hash

我正在阅读pyspark here的源代码。我对这里的便携功能感到很困惑。

def portable_hash(x):
    """
    This function returns consistant hash code for builtin types, especially
    for None and tuple with None.
    The algrithm is similar to that one used by CPython 2.7
    >>> portable_hash(None)
    0
    >>> portable_hash((None, 1)) & 0xffffffff
    219750521
    """
    if x is None:
        return 0
    if isinstance(x, tuple):
        h = 0x345678
        for i in x:
            h ^= portable_hash(i)
            h *= 1000003
            h &= sys.maxint
        h ^= len(x)
        if h == -1:
            h = -2
        return h
    return hash(x)

我可以看到它是一个递归函数。如果输入是元组,则递归循环遍历每个元素。

以下是我的一些问题:

  1. 这种哈希方法是一对一的映射吗?
  2. 此函数只接受None和tuple和 考虑到哈希值,我知道列表对象不是 他们是故意还是没有这样做。
  3. 我没有太多的哈希经验,这是一种非常经典的哈希方法,如果有的话,有什么资源可以让我更好地理解它吗?

1 个答案:

答案 0 :(得分:2)

  

"这种哈希方法是一对一的映射吗?"

NO 散列方法是1:1:它们都将M个可能的输入映射到N个可能的整数结果中,其中M远大于N.

  

"这个函数只考虑None和元组和可散列的值,我知道列表对象是不可编辑的,他们是否故意这样做。"

是的,此函数委托内置hash除元组和None以外的所有其他内容。它绝对是Python中的一个深思熟虑的设计决策(也受到这个功能的尊重),可以制作可变的内置插件,例如listdict 可以使用。 / p>

  

"我没有太多的哈希经验,这是一种非常经典的哈希方法,如果有的话,是否有任何资源可以让我更好地理解它?"

是的,对项目的散列进行排他性或散列,并在运行总计时对其进行修改,这确实是散列可散列物品容器的一种非常经典的方法。

有关哈希的更多研究,请从http://en.wikipedia.org/wiki/Hash_function开始。