哈希函数输出0到255之间的整数?

Mik*_*ski 4 python hash integer

我需要一个非常简单的Python函数,它将字符串转换为0到255之间的整数.

例如:

>>> hash_function("abc_123")
32
>>> hash_function("any-string-value")
99
Run Code Online (Sandbox Code Playgroud)

只要每次调用函数时得到相同的整数,整数是什么并不重要.

我想使用整数来生成基于网络名称的随机子网掩码.

Mar*_*ers 17

你可以使用hash()函数输出的模数:

def onebyte_hash(s):
    return hash(s) % 256
Run Code Online (Sandbox Code Playgroud)

这是字典和集合使用的内容(哈希模数为内部表大小).

演示:

>>> onebyte_hash('abc_123')
182
>>> onebyte_hash('any-string-value')
12
Run Code Online (Sandbox Code Playgroud)

警告:在Python 3.3及更高版本中,默认情况下启用哈希随机化,在重新启动Python之间,您将获得不同的值.然后,如果您不重新启动Python进程或设置PYTHONHASHSEED为固定的十进制数(并0完全禁用它),那么哈希就是稳定的.在Python 2和3.0到3.2哈希随机化要么不可用,要么仅在您明确设置种子时才启用.

另一个替代方法是hashlib.md5()只取第一个字节的(整数值):

import hashlib

try:
    # Python 2; Python 3 will throw an exception here as bytes are required
    hashlib.md5('')
    def onebyte_hash(s):
        return ord(hashlib.md5(s).digest()[0])
except TypeError:
    # Python 3; encode the string first, return first byte
    def onebyte_hash(s):
        return hashlib.md5(s.encode('utf8')).digest()[0]
Run Code Online (Sandbox Code Playgroud)

MD5是一个完善的加密哈希,输出在Python版本中是稳定的,并且独立于哈希随机化.

后者的缺点是它会慢一点; Python在字符串对象上缓存字符串哈希,因此稍后检索哈希在大多数情况下都是快速且便宜的.