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