3

JavaScript と Python の両方で、JSON が表現できるものに限定されたオブジェクト/辞書を一貫してハッシュする最良の方法は何ですか? 多くの異なる言語ではどうですか?

もちろん、文字列を受け取る多くの異なる言語で一貫して実装されているハッシュ関数がありますが、オブジェクトをハッシュするには、最初にそれを文字列表現に変換する必要があります。

どの言語でも同じ辞書に対して常に同じ値を返すハッシュ関数が必要ですが、JSON 仕様では、シリアル化された表現のキーの順序について何も保証されていません。

と同じようjson.dumps()に動作しますか? JSON.stringify()これをどのように確認しますか?

そうでない場合、一貫した結果を生成するために呼び出し元による追加の処理を必要としない、多くの言語のライブラリを使用したシリアル化形式がありますか (私は実際には Python と JavaScript に興味がありますが、すべての言語にも興味があります)。

4

3 に答える 3

4

これを 2 つの問題に分けます。

  1. JavaScript と Python の両方で同じシリアル化された文字列を取得するにはどうすればよいですか?
  2. どのバイト配列ハッシュ関数を使用する必要がありますか? JavaScript と Python の両方で同一の実装を持つ確立されたアルゴリズムである必要があります。

(1) を使用して 2 つの文字列を取得し、UTF8 エンコードしてから (2) を使用してハッシュを取得します。

(2)は分かりやすいので、(1)だけ取り上げます。

生成する 2 つの JSON 文字列が同一であることを確認するという問題には、複数の側面があります。

  • フォーマットされていない JSON を使用することをお勧めします (不要なスペース、タブ、または改行はありません)。
  • null 値も同様に処理する必要があります。一部のシリアライザは、値が null の場合、ディクショナリのキーと値のペアをデフォルトで破棄します。
  • ディクショナリ内のキーと値のペアの順序は一貫している必要があります。
  • JSON 番号のシリアル化は一貫している必要があります。たとえば、1 一方と他方で整数をシリアル化することはできません1.0。(ただし、これはおそらくそれほど大きな問題ではありません。)
  • 文字列エンコーディングは両方で同じである必要があります。JSON では Unicode テキストへのシリアル化が許可されますが、JSON 文字列でそれを義務付け、バックスラッシュでエスケープするだけ"です\。ただし、ほとんどのシリアライザーは必要以上のことを行い、ほとんどすべての Unicode 文字を\uXXXX同等のものに減らします。JSON 文字列エンコーディングの詳細については、json.orgを参照してください。あいまいさをすべて取り除く 1 つの方法は、絶対に必要な場合にのみエスケープすることです。

これらすべてが JavaScript と Python の間で一致していることを確認する必要があります。私が使用したほとんどの JSON シリアライゼーション ライブラリは、上記のリストで言及したすべてのものに対して構成フックを提供します。残念ながら、私は JavaScript や Python のライブラリにあまり詳しくありません。

于 2013-11-08T05:14:45.873 に答える
0

JSON は、オブジェクトの状態を表すための明確に定義された言語です。関数の動作は同じではありませんが、同じように動作します。

例えば:

json.dumps({'hello':'goodbye', 123: 456})

次のいずれかを生成する可能性があります。

{"hello":"goodbye", "123": 456}

また

{"123": 456, "hello":"goodbye"}

パラメータを渡すと、indentさまざまな結果が得られる可能性がさらに高くなります。

ほとんどの言語では、JSON を処理する方法が組み込まれていない場合 (Python や JS など)、サードパーティのユーティリティで十分です (.NET 用の Newtonsoft JSON ライブラリを参照してください)。

私が認識している各言語は有効な JSON を生成します。つまり、JSON パーサーを提供する他の各言語で解析できます。

于 2013-11-08T05:14:00.043 に答える