我需要在Python 3中生成MD5哈希值,以与在Python 2中生成的MD5哈希值进行比较,但是json.dumps()的结果是不同的,因为在Python 2上元素的位置发生了变化,而MD5结果为不同。
如何产生相同的结果?
编码:
content = {'name': 'Marcelo', 'age': 30, 'address': {'country': 'Brasil'}, 'interests': [{'id': 1, 'description': 'tecnology'}]}
print('CONTENT:', json.dumps(content))
print('MD5:', md5(str(content).encode('UTF-8')).hexdigest())
Python 2.7结果:
('CONTENT:', {'interests': [{'id': 1, 'description': 'tecnology'}], 'age': 30, 'name': 'Marcelo', 'address': {'country': 'Brasil'}})
('MD5:', 'a396f6997fb420992d96b37e8f37938d')
Python 3.6结果:
CONTENT: {'name': 'Marcelo', 'age': 30, 'address': {'country': 'Brasil'}, 'interests': [{'id': 1, 'description': 'tecnology'}]}
MD5: 40c601152725654148811749d9fc8878
编辑:
我无法更改在Python 2上生成的MD5。有什么方法可以在Python 3上从Python 2重现默认顺序?
在3.6之前的Python中,字典键不排序。因此,在Python 3.6中,键保持其插入顺序(或在字典文字的情况下,它们在文字中的显示方式)。Python 2.7字典是无序的,因此循环顺序不一定与插入顺序匹配。
如果您在两种情况下都重新加载json字典,它将仍然相等(字典相等性不取决于顺序)。
因此,这里没有错误。差异是由于在不同的Python版本中字典的排序方式。
json.dump
并按json.dumps
字典循环顺序写出键/值对。因此,为了具有一致的循环顺序,最好使用collections.OrderedDict
类型以实现一致的顺序。如果您json.load
要获取字典,则还需要使用json.loads(text, object_hook=OrderedDict)
,它将保持顺序。
没有简单的方法可以使Python 3字典使用Python 2排序,因此同时使用2和3代码库OrderedDict
是一种更可维护的解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句