hash()函数的最小值?

flo*_*low 1 c python hash 32bit-64bit python-3.x

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

我想使用哈希给数据库值一个快速的"指纹"(基本上很容易看出两个长的,类似的文本是否实际上是相同的),并且想要摆脱负数(为简单起见),所以我以为我只是添加最小的可能值来获得零和向上的值.手册非常有用地说明"哈希值是整数".这和我之前知道的一样多.

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

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

编辑:我强烈怀疑答案将与sys.maxintpython 3中遗憾地删除密切相关.我的怀疑是我应该def xhash( x ): return hash( x ) - ( -maxint - 1 )如果maxint可用.我知道由于整体和多头的统一,这个价值"失去了它的价值",但这里可能仍然是一个有用的领域.任何人都知道如何实现模拟?

Ned*_*der 5

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

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

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

hash(x) % 100000000
Run Code Online (Sandbox Code Playgroud)

或者你可以得到一个八字符的字母数字哈希来显示:

md5(hash(x)).hexdigest()[:8]
Run Code Online (Sandbox Code Playgroud)