Hash 散列任意对象的正确方法

Hash 散列任意对象的正确方法,hash,md5,go,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上调用此函数将导致:

我正在编写一个需要散列任意对象的数据结构。如果我给一个
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
上调用此函数将导致:

死机:二进制。写入:无效的int类型


正确的方法是什么?

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

我发现一个好方法是使用“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()
}

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

是的。那么,在这种情况下,您应该做什么呢?您可以做如下操作:foo:=uint32(123);binary.Write(buffer,order,foo)或binary.Write(buffer,order,uint32(foo)),或使用其他类似的行。是的,这可能就是解决方法。您的实现存在一些问题。首先,每当您编码一个新类型并在以后通过ID引用它时,gob协议就会传输类型定义。因此,您的Hash()方法在第一次使用时会返回一个不同的Hash。其次,这些全局变量可能会导致竞争条件,这也是产生不同散列的原因。tux21b关于gob是正确的(尽管并不打算使用线程安全)。