Maison >développement back-end >Golang >L'encodage « encoding/gob » de Go est-il déterministe et comment obtenir une sortie déterministe ?

L'encodage « encoding/gob » de Go est-il déterministe et comment obtenir une sortie déterministe ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-02 03:50:10258parcourir

Is Go's `encoding/gob` Encoding Deterministic, and How Can Deterministic Output Be Achieved?

Déterminisme dans l'encodage/Gob

Arrière-plan

Lors de l'encodage d'objets de type x et y au format GOB, on s'attend généralement à ce que gob_encode(x) et gob_encode(y) produisent toujours des octets identiques séquences, étant donné que les objets sont égaux.

Déterminisme du codage GOB

encoding/gob fournit une implémentation non déterministe du codage GOB lorsque des cartes sont impliquées. Cette incertitude provient de l'ordre d'itération arbitraire des cartes, conduisant à un ordre de sérialisation incohérent lors du codage.

Impact des spécificateurs de type

Cependant, pour les valeurs non cartographiques, le codage /gob implémente une approche déterministe. En effet, chaque élément de données d'un flux GOB est préfixé par un spécificateur de type. La première occurrence d'un type dans le flux inclut la définition complète du type. Les occurrences ultérieures du même type font référence à la spécification de type initiale à l'aide d'une référence ou d'un identifiant.

Exemple

Dans l'exemple suivant, nous créons une structure Int personnalisée et la codons plusieurs fois en utilisant le gob encodeur.

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())

Sortie :

[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]

Bien que l'encodage initial inclut la définition complète du type, les encodages suivants ne transmettent qu'une référence de type, ce qui entraîne différentes séquences d'octets.

Implications

En général, à moins que vous n'exigeiez strictement une sortie déterministe, cela Il n'est pas nécessaire de s'inquiéter du comportement susmentionné.

Cependant, il est important de noter qu'une sortie déterministe peut être obtenue en évitant l'utilisation de cartes et en utilisant plusieurs encodeurs avec un ordre identique des valeurs codées.

De plus, les modifications apportées à l'implémentation de l'encodage/gob entre les versions Go peuvent affecter la cohérence de la sortie. La compatibilité est maintenue, mais le résultat exact peut varier.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn