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

时间:2015-08-13 02:11:31

标签: python json md5

我需要对dict或list的内容进行md5哈希,并且我想确保两个等效的结构会给我相同的哈希结果。

到目前为止,我的方法是仔细定义结构的顺序,并在运行json.dumps()之前对它们包含的各种列表和词典进行排序。

然而,随着我的结构变得越来越复杂,这变得越来越费力且容易出错,而且在任何情况下我都不确定它是100%的工作时间还是98%的工作时间。

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

当我序列化对象时,我只需要字符串(然后是md5)就可以了 - 我并不关心这个用例的反序列化。

1 个答案:

答案 0 :(得分:4)

默认情况下,JSON输出是非确定性的,因为__hash__的结果被加密str(典型JSON对象的键值)以阻止DoS向量(请参阅文档中的注释)。因此,您需要在sort_keys设置为True的情况下致电json.dumps

>>> 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),您需要确保按预期方式完成排序,因为定义列表未按顺序排列以任何特定的方式(这些集合中元素的排序将持续存在于程序本身放置/修改的位置)。