인코딩/Gob의 결정성
배경
x 및 y 유형의 객체를 인코딩할 때 GOB 형식으로 변환하는 경우 일반적으로 gob_encode(x)와 gob_encode(y)는 객체가 동일하다면 항상 동일한 바이트 시퀀스를 생성합니다.
GOB 인코딩의 결정성
encoding/gob은 다음의 비결정적 구현을 제공합니다. 맵이 포함될 때 GOB 인코딩. 이러한 불확실성은 맵의 임의 반복 순서로 인해 발생하며 인코딩 중에 직렬화 순서가 일관되지 않게 됩니다.
유형 지정자의 영향
그러나 맵이 아닌 값의 경우 인코딩 /gob은 결정론적 접근 방식을 구현합니다. 이는 GOB 스트림의 각 데이터 항목 앞에 유형 지정자가 붙기 때문입니다. 스트림에서 처음으로 나타나는 유형에는 전체 유형 정의가 포함됩니다. 동일한 유형의 후속 발생은 참조 또는 식별자를 사용하여 초기 유형 사양을 참조합니다.
예
다음 예에서는 사용자 정의 구조체 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!