hash()函数的最小值?

时间:2010-10-24 22:44:39

标签: python c hash python-3.x 32bit-64bit

在python(3)中,hash(x)可以返回的最小值是多少?

我想使用哈希为数据库值提供一个快速的“指纹”(基本上可以很容易地看到两个冗长的,类似的文本是否实际上相等),并且想要摆脱负数(为简单起见) ,所以我想我只是添加最小的可能值来获得零和向上的值。 the manual非常有用地说明“哈希值是整数”。这和我之前知道的差不多。

今天当我发现我在64位ubuntu上的手工编译的python显然使用64位左右的散列函数时,我有点惊讶;我一直以为应该是32位。机器架构会对hash()函数产生影响吗?

另外,当我编译python时,我没有设置任何选项来编译64位架构(希望它“只是工作”)。 python是自己调整还是我现在在64位机器上有32位python?这不是一个愚蠢的问题我相信很多时候根据处理器提供单独的包装。

编辑:我强烈怀疑答案与sys.maxint密切相关,而def xhash( x ): return hash( x ) - ( -maxint - 1 )已被遗忘在python 3中。我怀疑是maxint if {{ 1}}可用。我知道由于整体和多头的统一,这个价值“失去了它的价值”,但这里可能还有一个领域可能仍然有用。任何人都知道如何实现模拟?

4 个答案:

答案 0 :(得分:5)

hash()可以返回任何整数,如您所见,整数的大小可能因架构而异。这是字典排序是任意的原因之一:在两个不同平台上的相同操作集可以给出不同的结果,因为沿途使用的哈希值可能不同。

如果你所做的只是显示快速指纹的哈希值,那么只需保留一部分比特。它仍然有效作为哈希。散列函数的唯一要求是相等的值必须具有相等的散列。之后,哈希之间的差异只会影响使用哈希算法的效率,因为冲突的可能性会上升或下降。

例如,您可以决定是否需要8位哈希,并使用以下方法获取:

hash(x) % 100000000

或者您可以使用以下内容显示八个字符的字母数字哈希:

md5(hash(x)).hexdigest()[:8]

答案 1 :(得分:4)

哈希函数通常使用返回值的全范围。原因是它们通常由位操作构成(移位,xoring等) - 返回值中的位都在算法中使用。

为什么正值比负值更容易或更难?

答案 2 :(得分:1)

你的问题的答案应该是:

assert(hash(100) == 100 and hash(-100) == -100)
smallest_hash_value= -2**min(range(256), key=lambda i: hash(-2**i))

这取决于Python使用整数本身作为哈希(-1除外)iff整数是有效hash()结果的事实。无论架构如何,算法通常应该保持不变。

答案 3 :(得分:1)

所以今天我在谷歌赌场更幸运,这就是我发现的:

(1)系统架构是否可以在64或32位机器上运行给定的python

from platform import architecture
print( architecture() )

来自文档:“查询给定的可执行文件(默认为Python解释器二进制文件)以获取各种体系结构信息。返回一个元组(位,链接),其中包含有关位体系结构和用于可执行文件的链接格式的信息。值以字符串形式返回。“在我的机器上,那是('64bit', 'ELF')。宾果游戏。

(2)最小整数 python 3中没有sys.maxint,但有sys.maxsize。文档说“一个赋予最大值的整数可以是Py_ssize_t类型的变量。在32位平台上通常为2**31 - 1,在64位平台上为2**63 - 1。”因此,

from sys import maxsize
assert maxsize == 2**63 - 1

在我的机器上运行。

(3)直接回答原始问题:“hash()函数的最小值应为负sys.maxsize报告。因此,它可以是预计

def xhash( x ): return hash( x ) + sys.maxsize + 1

只会报告值≥0。“