生成JSON的md5哈希并在Python和JavaScript中进行比较

时间:2018-07-16 10:40:55

标签: javascript python hash md5

我有一个用例,其中我必须生成md5对象的JSON哈希并比较服务器和浏览器中的哈希。

浏览器客户端生成哈希,然后向服务器请求相同资源的哈希(恰好是JSON对象),然后比较两个哈希以确定下一步做什么。

对于服务器,我正在使用Python,而浏览器客户端在Javascript中。

对我来说,两种情况下生成的哈希都不匹配。这是我的代码:

Python

>>> import hashlib
>>> import json

>>> a = {"candidate" : 5, "data": 1}
>>> a = json.dumps(a, sort_keys = True).encode("utf-8")
>>> hashlib.md5(a).hexdigest()
>>> 12db79ee4a76db2f4fc48624140adc7e

JS : 我正在使用md5在浏览器中进行哈希处理

> var hash = require("md5")
> var data = {"candidate":5, "data":1}
> data = JSON.stringify(data)
> md5(data)
> 92e99f0a99ad2a3b5e02f717a2fb83c2

我做错了什么?

1 个答案:

答案 0 :(得分:14)

您假设两种语言都生成看起来相同的JSON。

>>> json.dumps({"candidate" : 5, "data": 1}, sort_keys=True)
'{"candidate": 5, "data": 1}'

js> JSON.stringify({"candidate" : 5, "data": 1})
"{\"candidate\":5,\"data\":1}"

幸运的是,他们可以。

>>> a = json.dumps({"candidate" : 5, "data": 1}, sort_keys=True, indent=2)
'{\n  "candidate": 5,\n  "data": 1\n}'

js> var a = JSON.stringify({"candidate" : 5, "data": 1}, null, 2)
"{\n  \"candidate\": 5,\n  \"data\": 1\n}"

现在散列也将相同。

Python:

>>> hashlib.md5(a.encode("utf-8")).hexdigest()
>>> d77982d217ec5a9bcbad5be9bee93027

JS:

>>> md5(a)
>>> d77982d217ec5a9bcbad5be9bee93027