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

时间:2016-09-26 12:11:10

标签: python hash integer

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

例如:

>>> hash_function("abc_123")
32
>>> hash_function("any-string-value")
99

只要每次调用函数时得到相同的整数,整数是什么都没关系。

我想使用整数根据网络名称生成随机子网掩码。

1 个答案:

答案 0 :(得分:16)

您可以使用hash() function输出的模数:

def onebyte_hash(s):
    return hash(s) % 256

这是字典和集合使用的内容(散列模数为内部表大小)。

演示:

>>> onebyte_hash('abc_123')
182
>>> onebyte_hash('any-string-value')
12

警告:在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]

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

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