編碼/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中文網其他相關文章!