如何计算通过gob.Encode写入的每个记录的哈希值

如何计算通过gob.Encode写入的每个记录的哈希值,go,hash,checksum,gob,Go,Hash,Checksum,Gob,我的目标是创建类似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) {

我的目标是创建类似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

沃尔日志是多余的:)为什么?gob提供安全还是什么?WAL=“提前写入日志”。所以你是说“写啊读日志”啊好吧