hash()函数的最小值是多少?
在Python(3)中,hash(x)
能返回的最小值是多少呢?
我想用哈希值来给数据库中的值快速生成一个“指纹”(简单来说,就是方便判断两个比较长且相似的文本是否真的相等),而且我想去掉负数(为了简单起见),所以我想直接加上可能的最小值,让结果都是零或更大的数。手册上很贴心地说“哈希值是整数。”这也是我之前知道的全部。
今天我有点惊讶,发现我在64位的Ubuntu上手动编译的Python似乎使用了大约64位的哈希函数;我一直以为应该是32位。机器的架构会影响hash()
函数吗?
另外,当我编译Python时,并没有设置任何选项来编译成64位架构(希望它能“自动适应”)。Python会自己调整吗,还是说我现在在64位机器上运行的是32位的Python?我觉得这个问题并不傻,因为很多时候你会看到根据处理器提供不同的安装包。
编辑:我强烈怀疑答案会和sys.maxint
有关,但可惜在Python 3中已经被移除了。我猜如果maxint
还在的话,我应该可以这样写def xhash( x ): return hash( x ) - ( -maxint - 1 )
。我知道这个值因为整型和长整型的统一而“失去了价值”,但这里可能是一个仍然可以用到的地方。有没有人知道怎么实现一个类似的东西?
4 个回答
你问的问题的答案应该是:
assert(hash(100) == 100 and hash(-100) == -100)
smallest_hash_value= -2**min(range(256), key=lambda i: hash(-2**i))
这取决于Python是如何处理整数的。Python会把整数本身当作一个哈希值(除了-1
这个例外),前提是这个整数是一个有效的hash()
结果。通常情况下,不管计算机的架构是什么,算法应该都是一样的。
哈希函数通常会利用返回值的全部范围。原因是它们通常是通过位运算(比如位移、异或等)来构建的——在算法中,返回值的每一位都被用到了。
那么,为什么正值比负值更容易或更难呢?
hash()
函数可以返回任何整数,而且你会发现这个整数的大小会根据不同的计算机架构而变化。这就是为什么字典的顺序是随意的原因之一:在两个不同的平台上进行相同的操作可能会得到不同的结果,因为在这个过程中使用的哈希值可能不同。
如果你只是想快速显示一个哈希值作为指纹,那么只需保留一部分位数就可以了。这仍然算作有效的哈希。哈希函数唯一的要求是相同的值必须有相同的哈希值。之后,哈希值之间的差异只会影响使用这些哈希的算法的效率,因为碰撞的可能性会有所增加或减少。
例如,你可以决定想要一个8位的哈希值,然后可以使用:
hash(x) % 100000000
或者你可以得到一个八个字符的字母数字哈希值来显示:
md5(hash(x)).hexdigest()[:8]