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是正确的(尽管并不打算使用线程安全)。