7

我想散列一个简单的字符串数组文档说你不能简单地将字符串输入 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()
4

3 回答 3

10

您可以使用该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']
于 2013-07-03T07:21:44.917 回答
2

根据您要执行的操作,分别获取连接的所有字符串的哈希值或每个字符串的哈希值。您可以在 Thomas 解决方案之后获得拳头作为 m.update(a); m.update(b) 等价于 m.update(a+b)。 或后面的以下解决方案

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

    return [hashlib.md5(i.encode('utf-8')).hexdigest() for i in data]

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

于 2013-07-01T21:41:47.377 回答
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']会散列到相同的值。

如果您提供有关目标的更多背景信息,则其他解决方案可能更合适。

于 2013-07-01T19:41:10.893 回答