Моя цель - создать что-то вроде WAL-журнала и обеспечить согласованность данных. Я использую некоторое хеширование.
У меня есть следующий код для вычисления хэша для каждой закодированной записи:
package dumper_test
import (
"bufio"
"bytes"
"encoding/gob"
"hash/crc32"
"io"
"testing"
)
type Entry struct {
A string
B bool
}
func TestX(t *testing.T) {
gob.Register(Entry{})
// encoder part part
encHasher := crc32.New(crc32.MakeTable(crc32.Castagnoli))
w := &bytes.Buffer{}
enc := gob.NewEncoder(io.MultiWriter(w, encHasher))
entry := Entry{}
if err := enc.Encode(&entry); err != nil {
t.Fatal(err)
}
t.Logf("encHash: %d", encHasher.Sum32())
if err := enc.Encode(&entry); err != nil {
t.Fatal(err)
}
t.Logf("encHash: %d", encHasher.Sum32())
// decoder part
decHasher := crc32.New(crc32.MakeTable(crc32.Castagnoli))
r := bufio.NewReader(w)
dec := gob.NewDecoder(io.TeeReader(r, decHasher))
var decEntry Entry
if err := dec.Decode(&decEntry); err != nil {
t.Fatal(err)
}
t.Logf("decHash: %d", decHasher.Sum32())
if err := dec.Decode(&decEntry); err != nil {
t.Fatal(err)
}
t.Logf("decHash: %d", decHasher.Sum32())
if encHasher.Sum32() != decHasher.Sum32() {
t.Fail()
}
}
Он выдает следующий вывод:
=== RUN TestX
--- PASS: TestX (0.00s)
gob_test.go:29: encHash: 3843220763
gob_test.go:33: encHash: 1109147424
gob_test.go:43: decHash: 1109147424
gob_test.go:47: decHash: 1109147424
PASS
Так почему хэши совпадают, когда я последовательно декодирую записи?Как этого добиться:
=== RUN TestX
--- PASS: TestX (0.00s)
gob_test.go:29: encHash: 3843220763
gob_test.go:33: encHash: 1109147424
gob_test.go:43: decHash: 3843220763
gob_test.go:47: decHash: 1109147424
PASS