如何创建自定义哈希码以确定数据是否已发生变异

时间:2016-04-19 19:39:08

标签: go

假设我有一个包含int64和bools的结构类型,以及包含更多int64和bool类型字段的嵌入类型。

type T1 struct {
   f1 int64
   f2 int64
   f3 bool
   T2 T2
}

type T2 struct {
   f4 int64
   f5 int64
   f6 bool
}

现在使用所有结构域/属性,我想生成一个哈希码。

这样做的目的是确定实例的内容是否已更改,但是比较了之前/之后的哈希码值。

因此,如果T1实例已经改变,即它自己的任何属性那么哈希的值应该是不同的。

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

func (t *T1) Hash() uint64 {
    hb := make([]byte, 8+8+1+8+8+1)
    binary.BigEndian.PutUint64(hb, uint64(t.f1))
    binary.BigEndian.PutUint64(hb[8:], uint64(t.f2))
    if t.f3 {
        hb[16] = 1
    }
    binary.BigEndian.PutUint64(hb[17:], uint64(t.T2.f4))
    binary.BigEndian.PutUint64(hb[25:], uint64(t.T2.f5))
    if t.T2.f6 {
        hb[33] = 1
    }
    f := fnv.New64a()
    f.Write(hb)
    return f.Sum64()
}

playground

虽然如果你将它用作地图键,最好直接使用struct作为键,然后放手操作。

相关问题