在python 3中散列数组或对象

时间:2013-07-01 19:36:13

标签: python hash python-3.x md5

我想哈希一个简单的字符串数组 文档说你不能简单地将字符串提供给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()

3 个答案:

答案 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]

请注意,它会返回一个列表。每个元素都是给定字符串列表中相应元素的哈希