我需要一个非常简单的Python函数,它将字符串转换为0到255之间的整数。
例如:
>>> hash_function("abc_123")
32
>>> hash_function("any-string-value")
99
只要每次调用函数时得到相同的整数,整数是什么都没关系。
我想使用整数根据网络名称生成随机子网掩码。
答案 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在字符串对象上缓存字符串哈希,因此稍后检索哈希在大多数情况下都是快速且便宜的。