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)
我可以看出这是一个递归函数。如果输入是元组,则递归循环遍历每个元素。
以下是我的几个问题:
- 这种哈希方法是一对一映射吗?
- 这个函数只接受 None 和 tuple and
考虑哈希值,我知道列表对象不是
hashable,他们是有意还是无意的。
- 我对散列的经验不多,这是不是一种非常经典的散列方法,如果是的话,有什么资源可以让我更好地理解它吗?
"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 中的一个深思熟虑的设计决定(也受到此功能的尊重)来制作可变的内置函数,例如 list
和 dict
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 开始。
我正在阅读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)
我可以看出这是一个递归函数。如果输入是元组,则递归循环遍历每个元素。
以下是我的几个问题:
- 这种哈希方法是一对一映射吗?
- 这个函数只接受 None 和 tuple and 考虑哈希值,我知道列表对象不是 hashable,他们是有意还是无意的。
- 我对散列的经验不多,这是不是一种非常经典的散列方法,如果是的话,有什么资源可以让我更好地理解它吗?
"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 中的一个深思熟虑的设计决定(也受到此功能的尊重)来制作可变的内置函数,例如 list
和 dict
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 开始。