编码/Gob 中的确定性
背景
对 x 和 y 类型的对象进行编码时转换为 GOB 格式时,一个常见的期望是 gob_encode(x) 和假设对象相等,gob_encode(y) 将始终生成相同的字节序列。
GOB 编码的确定性
encoding/gob 提供了非确定性实现涉及地图时的 GOB 编码。这种不确定性源于映射的任意迭代顺序,导致编码期间序列化顺序不一致。
类型说明符的影响
但是,对于非映射值,编码/gob 实现了确定性方法。这是因为 GOB 流中的每个数据项都以类型说明符为前缀。流中第一次出现的类型包含完整的类型定义。相同类型的后续出现使用引用或标识符来引用初始类型规范。
示例
在下面的示例中,我们创建一个自定义 struct Int 并对其进行编码多次使用 gob编码器。
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中文网其他相关文章!