Python 便携式哈希

Python Portable 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 and 考虑哈希值,我知道列表对象不是 hashable,他们是有意还是无意的。
  3. 我对散列的经验不多,这是不是一种非常经典的散列方法,如果是的话,有什么资源可以让我更好地理解它吗?

"is this hash approach an one to one mapping?"

NO 哈希方法是一对一的:它们都将 M 个可能的输入映射到 N 个可能的整数结果,其中 M 远大于 N。

"this function only takes None and tuple and hashable values into consideration, I know that list object is not hashable, did they do that intentionally or not."

是的,此函数委托给内置 hash 除元组和 None 之外的所有其他内容。这绝对是 Python 中的一个深思熟虑的设计决定(也受到此功能的尊重)来制作可变的内置函数,例如 listdict not可散列。

"I don't have much experience with hash, is this a very classic hashing approach, if so, is there any resource for me to get a better understanding for it?"

是的,项目的异或散列,随着一个经过修改 运行 总数,确实是一种非常经典的散列可散列项目容器的方法。

有关散列的更多研究,我将从 http://en.wikipedia.org/wiki/Hash_function 开始。