我需要在Python一个很简单的哈希函数,将一个字符串转换为从0的整数255输出从0到255的整数的散列函数?
例如:
>>> hash_function("abc_123")
32
>>> hash_function("any-string-value")
99
不要紧整数是什么,只要我每次调用该函数时都会得到相同的整数。
我想使用整数来生成一个基于网络名称的随机子网掩码。
我需要在Python一个很简单的哈希函数,将一个字符串转换为从0的整数255输出从0到255的整数的散列函数?
例如:
>>> hash_function("abc_123")
32
>>> hash_function("any-string-value")
99
不要紧整数是什么,只要我每次调用该函数时都会得到相同的整数。
我想使用整数来生成一个基于网络名称的随机子网掩码。
你可以只使用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会在字符串对象上缓存字符串散列,因此大多数情况下稍后检索散列是快速和便宜的。
你打算如何获得散列值? –
你的用例很好,能够区分256个唯一值,并且除了那个冲突之外还有其他的东西吗?使用更大的标准散列有什么问题? – deceze
我想将输出用作网络中子网掩码的一部分 –