散列任意对象的正确方法

时间:2011-04-22 23:32:59

标签: hash md5 go

我正在编写一个需要散列任意对象的数据结构。如果我给int作为参数,则以下函数似乎失败。

func Hash( obj interface{} ) []byte {
    digest := md5.New()
    if err := binary.Write(digest, binary.LittleEndian, obj); err != nil {
        panic(err)
    }
    return digest.Sum()
}

int上调用此选项会导致:

  

恐慌:binary.Write:无效的类型int

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

我发现这样做的一个好方法是使用“gob”包序列化对象,顺序如下:

var (
    digest = md5.New()
    encoder = gob.NewEncoder(digest)
)

func Hash(obj interface{}) []byte {
    digest.Reset() 
    if err := encoder.Encode(obj); err != nil {
        panic(err)
    }
    return digest.Sum()
}

编辑:这不符合预期(见下文)。

答案 1 :(得分:2)

binary.Write写入“固定大小的值或指向固定大小值的指针”。类型int不是固定大小的值; int是“32位或64位”。使用固定大小的值,如int32。