散列任意对象的正确方法

发布于 2024-11-03 05:59:01 字数 395 浏览 0 评论 0原文

我正在编写一个需要散列任意对象的数据结构。如果我给出一个 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 类型无效

执行此操作的正确方法是什么?

I am writing a data structure that needs to hash an arbitrary object. The following function seems to fail if I give an int is the parameter.

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

Calling this on an int results in:

panic: binary.Write: invalid type int

What is the right way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

月下凄凉 2024-11-10 05:59:01

我发现执行此操作的一个好方法是使用“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()
}

编辑:这不会按预期工作(见下文)。

I found that a good way to do this is to serialize the object using the "gob" package, along the following lines:

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

Edit: This does not work as intended (see below).

飘逸的'云 2024-11-10 05:59:01

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

binary.Write writes "a fixed-size value or a pointer to a fixed-size value." Type int is not a fixed size value; int is "either 32 or 64 bits." Use a fixed-size value like int32.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文