【问题标题】:Hashing an array or object in python 3在 python 3 中散列一个数组或对象
【发布时间】:2013-07-01 19:36:12
【问题描述】:

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

【问题讨论】:

  • 据我所知,您应该可以将字符串输入到 hashlib 的更新函数中,您能提供更多信息吗?

标签: python hash python-3.x md5


【解决方案1】:

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

【讨论】:

  • 不能保证任意对象的__repr__ 返回的东西对于散列函数来说是有用的输入。 hashlib 对象本身,例如,repr() to ''。如果将其用于某些加密操作,即使忽略令人讨厌的影响,这甚至都不是确定性的!同一程序在不同时间运行不会返回相同的哈希值。
  • @EricSeppanen:答案与字符串数组有关。你说的对。不应该每件工作都使用锤子。
  • 您仍应尝试使用",".join(data) 之类的东西,因为不能保证__repr__ 与未来版本保持一致。也许 Python 4 会返回一个稍微不同的字符串(例如 s'abc 而不是 'abc')。
  • @JohannBauer:不太可能。无论如何,这个问题已经很老了,情况可能已经改变了。 ','.join(data) 有问题,因为['a,', 'bb'] 会产生与['a', ',bb'] 相同的结果。但你是对的。任何能够捕获字符串数组的表示并将其作为字节返回的合适函数都可以用于计算哈希值。
  • @EricJin:是的,但我们的目标是获得 list 字符串的字符串表示形式。
【解决方案2】:

根据您想要做的事情,获取连接的所有字符串的哈希值或单独获取每个字符串的哈希值。您可以按照托马斯解决方案获得拳头 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]

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

【讨论】:

    【解决方案3】:

    如果您想对字符串列表进行哈希处理,一个简单的解决方案可能是:

    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'] 会哈希到相同的值。

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

    【讨论】:

    • ...除了 update 需要字节,所以如果你有字符串,你需要先对它们进行编码。
    • @mata 哦,没有意识到这是一个 python3 问题 - 抱歉。
    猜你喜欢
    • 2018-06-16
    • 2023-03-22
    • 2021-11-21
    • 2020-07-08
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多