Python,di的校验和

2024-05-19 21:14:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个dict的校验和,以知道它是否被修改过 目前我有:

>>> import hashlib
>>> import pickle
>>> d = {'k': 'v', 'k2': 'v2'}
>>> z = pickle.dumps(d)
>>> hashlib.md5(z).hexdigest()
'8521955ed8c63c554744058c9888dc30'

或许存在更好的解决方案?

注意:我想创建一个dict的唯一id来创建一个好的Etag。

编辑:我可以在dict中包含抽象数据


Tags: 数据importid编辑k2解决方案校验md5
3条回答

像这样的:

reduce(lambda x,y : x^y, [hash(item) for item in d.items()])

对dict中的每个元组(键、值)进行哈希运算,并将它们全部异或。

@katrielex先生 如果dict包含不可更改的项,则可以执行以下操作:

hash(str(d))

或者更好

hash(repr(d))

我不知道pickle是否保证每次都以相同的方式序列化散列。

如果你只有字典,我会选择对keys()sorted()调用的o个组合,基于排序的键/值对构建一个字符串,并在此基础上计算校验和

在Python 3中,散列函数用随机数初始化,每个Python会话的随机数都不同。如果这对于预期的应用程序是不可接受的,请使用zlib.adler32来构建dict的校验和:

import zlib

d={'key1':'value1','key2':'value2'}
checksum=0
for item in d.items():
    c1 = 1
    for t in item:
        c1 = zlib.adler32(bytes(repr(t),'utf-8'), c1)
    checksum=checksum ^ c1

print(checksum)

相关问题 更多 >