Determinismus in der Kodierung/Gob
Hintergrund
Beim Kodieren von Objekten vom Typ x und y In das GOB-Format wird häufig erwartet, dass gob_encode(x) und gob_encode(y) immer identische Ergebnisse liefern Bytesequenzen, vorausgesetzt, die Objekte sind gleich.
Determinismus der GOB-Kodierung
encoding/gob bietet eine nichtdeterministische Implementierung der GOB-Kodierung, wenn Karten beteiligt sind. Diese Unsicherheit ergibt sich aus der willkürlichen Iterationsreihenfolge von Karten, was zu einer inkonsistenten Serialisierungsreihenfolge während der Codierung führt.
Auswirkungen von Typspezifizierern
Bei Nicht-Map-Werten jedoch die Codierung /gob implementiert einen deterministischen Ansatz. Dies liegt daran, dass jedem Datenelement in einem GOB-Stream ein Typbezeichner vorangestellt ist. Das erste Vorkommen eines Typs im Stream umfasst die vollständige Typdefinition. Nachfolgende Vorkommen desselben Typs verweisen mithilfe einer Referenz oder eines Bezeichners auf die ursprüngliche Typspezifikation.
Beispiel
Im folgenden Beispiel erstellen wir eine benutzerdefinierte Struktur Int und codieren sie mehrmals mit dem Gob 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())
Ausgabe:
[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]
Während die anfängliche Codierung die vollständige Typdefinition enthält, übertragen nachfolgende Codierungen nur eine Typreferenz, was zu unterschiedlichen Bytesequenzen führt.
Auswirkungen
Im Allgemeinen ist dies nicht notwendig, es sei denn, Sie fordern unbedingt eine deterministische Ausgabe besorgt über das oben genannte Verhalten.
Es ist jedoch wichtig zu beachten, dass eine deterministische Ausgabe erreicht werden kann, indem die Verwendung von Karten vermieden und mehrere Encoder mit identischer Reihenfolge der codierten Werte verwendet werden.
Zusätzlich , Änderungen in der Kodierungs-/Gob-Implementierung zwischen Go-Releases können sich auf die Konsistenz der Ausgabe auswirken. Die Kompatibilität bleibt erhalten, die genaue Ausgabe kann jedoch variieren.
Das obige ist der detaillierte Inhalt vonIst Gos „encoding/gob'-Kodierung deterministisch und wie kann eine deterministische Ausgabe erreicht werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!