2016-09-26 76 views
4

我需要在Python一个很简单的哈希函数,将一个字符串转换为从0的整数255输出从0到255的整数的散列函数?

例如:

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

不要紧整数是什么,只要我每次调用该函数时都会得到相同的整数。

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

+0

你打算如何获得散列值? –

+0

你的用例很好,能够区分256个唯一值,并且除了那个冲突之外还有其他的东西吗?使用更大的标准散列有什么问题? – deceze

+1

我想将输出用作网络中子网掩码的一部分 –

回答

13

你可以只使用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会在字符串对象上缓存字符串散列,因此大多数情况下稍后检索散列是快速和便宜的。

+0

'hash(ob)'是否返回负数?在这种情况下,对于C++ 11以后,模数返回值*必须*为负值。 – Bathsheba

+0

@Bathsheba:是的,它可以返回一个负数,但Python中的'%'无论如何返回一个正数。 –

+0

哇。 python和C++的另一个区别。有一个upvote。 – Bathsheba