doufu9836 2018-05-26 15:05
浏览 48

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

My target is to create something like WAL-log and to ensure that data consistent I use some hashing.

I have the following code computing hash for every encoded record:

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()
    }
}

It produces following output:

=== 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

So why hashes are the same when I decode entries sequentially? How to achieve this output:

=== 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
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
    • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
    • ¥15 MATLAB中streamslice问题
    • ¥15 如何在炒股软件中,爬到我想看的日k线
    • ¥15 51单片机中C语言怎么做到下面类似的功能的函数(相关搜索:c语言)
    • ¥15 seatunnel 怎么配置Elasticsearch
    • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
    • ¥15 (标签-MATLAB|关键词-多址)
    • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
    • ¥500 52810做蓝牙接受端