エンコーディング/Gob の決定論
背景
タイプ x および y のオブジェクトをエンコードする場合GOB 形式に変換する場合、一般的に予想されるのは、 gob_encode(x) とgob_encode(y) は、オブジェクトが等しい場合、常に同一のバイト シーケンスを生成します。
GOB エンコーディングの決定性
encoding/gob は、次の非決定性実装を提供します。マップが関係する場合の GOB エンコード。この不確実性は、マップの任意の反復順序から発生し、エンコード中のシリアル化順序の不一致につながります。
型指定子の影響
ただし、マップ以外の値の場合、エンコードは/gob は決定論的なアプローチを実装します。これは、GOB ストリーム内の各データ項目に型指定子がプレフィックスとして付けられているためです。ストリーム内で最初に出現する型には、完全な型定義が含まれます。同じ型の後続の出現は、参照または識別子を使用して最初の型仕様を参照します。
例
次の例では、カスタム構造体 Int を作成してエンコードします。ゴブを何度も使用してencoder.
type Int struct{ X int } b := new(bytes.Buffer) e := gob.NewEncoder(b) e.Encode(Int{1}) fmt.Println(b.Bytes()) e.Encode(Int{1}) fmt.Println(b.Bytes())
出力:
[23 255 129 3 1 1 3 73 110 116 1 255 130 0 1 1 1 1 88 1 4 0 0 0 5 255 130 1 2 0] [23 255 129 3 1 1 3 73 110 116 1 255 130 0 1 1 1 1 88 1 4 0 0 0 5 255 130 1 2 0 5 255 130 1 2 0]
最初のエンコードには完全な型定義が含まれますが、後続のエンコードでは型参照のみが送信されるため、異なるバイト シーケンスが生成されます。
影響
厳密に要求しない限り、一般に
ただし、マップの使用を回避し、エンコードされた順序が同じ複数のエンコーダーを使用することによって、決定的出力を実現できることに注意することが重要です。
さらに、Go リリース間のエンコーディング/gob 実装の変更は、出力の一貫性に影響を与える可能性があります。互換性は維持されますが、正確な出力は異なる場合があります。
以上がGo の「encoding/gob」エンコーディングは決定論的ですか?また、決定論的な出力はどのように達成できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。