在python 3中对数组或对象进行散列

在python 3中对数组或对象进行散列,python,hash,python-3.x,md5,Python,Hash,Python 3.x,Md5,我想散列一个简单的字符串数组 文档中说不能简单地将字符串输入hashlib的update()函数, 因此,我尝试了一个正则变量,但随后得到了支持所需缓冲区API的TypeError:objecterror 这是我到目前为止得到的 def generateHash(data): # Prepare the project id hash hashId = hashlib.md5() hashId.update(data) return hashId.hexdig

我想散列一个简单的字符串数组 文档中说不能简单地将字符串输入hashlib的update()函数, 因此,我尝试了一个正则变量,但随后得到了支持所需缓冲区API的
TypeError:object
error

这是我到目前为止得到的

def generateHash(data):
    # Prepare the project id hash
    hashId = hashlib.md5()

    hashId.update(data)

    return hashId.hexdigest()

如果要散列字符串列表,简单的解决方案可以是:

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']
会散列到相同的值


如果您提供有关目标的更多上下文,则其他解决方案可能更合适。

根据您想要执行的操作,将所有字符串的哈希值串联起来,或将每个字符串的哈希值分开。你可以得到第一个如下的Thomas解 或下面的后续解决方案

def generateHash(data):
    # Prepare the project id hash

    return [hashlib.md5(i.encode('utf-8')).hexdigest() for i in data]
请注意,它返回一个列表。每个元素都是给定字符串列表中对应元素的散列

您可以使用
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']

据我所知,您应该能够将一个字符串输入hashlib的更新函数,您能提供更多信息吗?…除了
update
需要字节,所以如果您有字符串,您需要首先对它们进行编码。@mata哦,我没有意识到这是一个python3问题-抱歉。不能保证任意对象的
\uuuu repr\uuuu
返回一些对哈希函数有用的输入。hashlib对象本身,例如,repr()到“”。即使忽略了一些令人讨厌的含义,如果这被用于一些加密操作,这甚至不是确定性的!在不同时间运行的同一程序不会返回相同的哈希值。@EricSeppanen:答案与字符串数组有关。你是对的。你不应该在每项工作中都使用锤子。你仍然应该尝试使用类似于
“,”的东西。加入(数据)
,因为
\uuuuu repr\uuu
不能保证与将来的版本一致。也许Python4会返回一个稍微不同的字符串(例如,
s'abc
而不是
'abc'
)。@JohannBauer:不太可能。无论如何,这个问题已经很老了,情况可能已经改变了。
,”.join(data)
有缺陷,因为
['a','bb']
会产生与
['a','bb']
相同的结果。但你是对的。任何捕获字符串数组表示形式并以字节形式返回的合适函数都可以用于计算哈希值。@EricJin:是的,但目标是获得字符串列表的字符串表示形式。