用于MD5哈希的Python + JSON序列化-如何保证两个等效的对象将序列化为完全相同的字符串?

乔诺诺莫

我需要对字典或列表的内容进行md5哈希处理,并且我想确保两个等效的结构将为我提供相同的哈希结果。

到目前为止,我的方法是仔细定义结构的顺序,并对它们包含的各种列表和字典进行排序,然后再进行遍历json.dumps()

但是,随着我的结构变得越来越复杂,这变得很费力且容易出错,无论如何我都不确定它是否在100%的时间或仅98%的时间工作。

只是好奇是否有人对此有快速的解决方案?我可以在json模块中设置一个选项以对对象进行完全排序吗?还是我可以用来对两种结构中的信息进行完整比较并返回保证唯一的哈希值的其他技巧?

当我序列化对象时,我只需要字符串(然后是md5)就可以输出相同的字符串-我不关心此用例的反序列化。

元烤面包机

默认情况下,JSON输出是不确定的,仅因为对的结果__hash__进行加盐str(典型JSON对象的键值)以防止DoS向量(请参阅文档中的注释)。出于这个原因,你需要调用json.dumpssort_keys设置为True。

>>> import json
>>> d = {'this': 'This word', 'that': 'That other word', 'other': 'foo'}
>>> json.dumps(d)
'{"this": "This word", "other": "foo", "that": "That other word"}'
>>> json.dumps(d, sort_keys=True)
'{"other": "foo", "that": "That other word", "this": "This word"}'

对于对象结了序列化成list(即listtuple),你将需要确保执行的顺序是在预期的方式,因为通过定义列表做任何特殊的方式是不排序在这些集合的元素(订货会中的地位持续它们已经由程序本身放置/修改了)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章