我正在阅读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)
我可以看到它是一个递归函数。如果输入是元组,则递归循环遍历每个元素。
以下是我的一些问题:
答案 0 :(得分:2)
"这种哈希方法是一对一的映射吗?"
NO 散列方法是1:1:它们都将M个可能的输入映射到N个可能的整数结果中,其中M远大于N.
"这个函数只考虑None和元组和可散列的值,我知道列表对象是不可编辑的,他们是否故意这样做。"
是的,此函数委托内置hash
除元组和None
以外的所有其他内容。它绝对是Python中的一个深思熟虑的设计决策(也受到这个功能的尊重),可以制作可变的内置插件,例如list
和dict
不可以使用。 / p>
"我没有太多的哈希经验,这是一种非常经典的哈希方法,如果有的话,是否有任何资源可以让我更好地理解它?"
是的,对项目的散列进行排他性或散列,并在运行总计时对其进行修改,这确实是散列可散列物品容器的一种非常经典的方法。
有关哈希的更多研究,请从http://en.wikipedia.org/wiki/Hash_function开始。