web-dev-qa-db-ja.com

JSONのmd5ハッシュを生成し、PythonとJavaScriptで比較します

JSONオブジェクトのmd5ハッシュを生成し、サーバーとブラウザーのハッシュを比較する必要があるユースケースがあります。

ブラウザクライアントはハッシュを生成し、サーバーに同じリソースのハッシュを求めます[これはたまたま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

私が間違っているのは何ですか?

10
xssChauhan

両方の言語が同一に見える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