【问题标题】:Python Portable HashPython 可移植哈希
【发布时间】:2015-01-03 18:52:50
【问题描述】:

我正在阅读 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. 我对哈希没有太多经验,这是一种非常经典的哈希方法吗?如果是,有什么资源可以让我更好地理解它吗?

【问题讨论】:

    标签: python hash


    【解决方案1】:

    “这种哈希方法是一对一映射吗?”

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

    “这个函数只考虑了 None 和 tuple 和 hashable 值,我知道 list 对象是不可散列的,他们是有意还是无意这样做的。”

    是的,这个函数委托给内置的hash 除了元组和None 之外的所有东西。这绝对是 Python 中经过深思熟虑的设计决定(也受到此函数的尊重),以使可变内置函数(例如 listdictnot 可散列)。

    “我对哈希没有太多经验,这是一种非常经典的哈希方法吗?如果是,有什么资源可以让我更好地理解它吗?”

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-19
      • 1970-01-01
      • 2012-05-02
      • 2015-04-13
      • 1970-01-01
      • 2019-05-19
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多