我想哈希一个简单的字符串数组
文档说你不能简单地将字符串提供给hashlib的update()函数,
所以我尝试了一个常规变量,但后来我得到了TypeError: object supporting the buffer API required
错误。
这是我到目前为止所做的事情
def generateHash(data):
# Prepare the project id hash
hashId = hashlib.md5()
hashId.update(data)
return hashId.hexdigest()
答案 0 :(得分:8)
您可以使用repr()
函数来获取数组的(Unicode)字符串表示形式(或实现转换为表示形式的任何对象)。然后将字符串编码为UTF-8(使用UTF-8时,每个字节的顺序都相同)。如上所述,可以对结果字节进行哈希处理:
#!python3
import hashlib
def hashFor(data):
# Prepare the project id hash
hashId = hashlib.md5()
hashId.update(repr(data).encode('utf-8'))
return hashId.hexdigest()
if __name__ == '__main__':
data1 = ['abc', 'de']
data2 = ['a', 'bcde']
print(hashFor(data1) + ':', data1)
print(hashFor(data2) + ':', data2)
它在我的控制台上打印:
c:\tmp\___python\skerit\so17412304>py a.py
d26d27d8cbb7c6fe50637155c21d5af6: ['abc', 'de']
dbd5ab5df464b8bcee61fe8357f07b6e: ['a', 'bcde']
答案 1 :(得分:1)
如果你想散列一个字符串列表,一个天真的解决方案可能是:
def hash_string_list(string_list):
h = hashlib.md5()
for s in string_list: # Note that you could use ''.join(string_list) instead
h.update(s) # s.encode('utf-8') if you're using Python 3
return h.hexdigest()
但是,请注意['abc', 'efg']
和['a', 'bcefg']
会哈希到相同的值。
如果您提供有关目标的更多背景信息,其他解决方案可能更合适。
答案 2 :(得分:1)
根据您的要求,分别连接所有字符串的哈希值或每个字符串的哈希值。你可以得到以下托马斯解决方案的拳头 m.update(a); m.update(b) is equivalent to m.update(a+b). 或者下面的解决方案
def generateHash(data):
# Prepare the project id hash
return [hashlib.md5(i.encode('utf-8')).hexdigest() for i in data]
请注意,它会返回一个列表。每个元素都是给定字符串列表中相应元素的哈希