来自结构的唯一哈希

Mar*_*nto 6 hash struct go

我想从结构数组生成一个唯一的散列。顺序可能不同,但值相同。

例子:

type MyStruct struct {
   ID string
   Parameters map[string]interface{}
}

arr:= []MyStruct{MyStruct{ID: "test", Parameters: map[string]interface{}{"key": true, "key2": "value"} }, MyStruct{ID: "test2", Parameters: map[string]interface{}{"key2": "value", "key": true} }}
//The order is different even inside the Parameters fields

arr:= []MyStruct{MyStruct{ID: "test2", Parameters: map[string]interface{}{"key2": "value", "key": true} },MyStruct{ID: "test", Parameters: map[string]interface{}{"key": true, "key2": "value"} }}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,散列应该相同,因为结构内的值是相同的。

编辑:基本上这个想法是为缓存生成一个唯一的哈希值!我想组合每个结构的单独哈希!

woa*_*oat 11

冯有一点,接受的答案不仅因为结构中没有导出字段,而且因为 MD5 散列的方式确实具有顺序意义这一事实,所以被接受的答案不起作用,请参阅RFC 1321 3.4

不确定功效,但我通过使用encoding/gobbytes表示要在Compare.

操场

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
)

type S struct {
    K1 string
    K2 int
}

func main() {
    sa := []S{{ K1: "foo", K2: 1}, {K1: "bar", K2: 2}, {K1: "baz", K2: 3,}}
    sb := []S{{ K1: "baz", K2: 3}, {K1: "bar", K2: 2}, {K1: "foo", K2: 1,}}
    sc := []S{}

    a := Hash(sa)
    b := Hash(sb)
    c := Hash(sc)

    fmt.Println(Compare(a, b))
    fmt.Println(Compare(a, c))
}

func Compare(a, b []byte) bool {
    a = append(a, b...)
    c := 0
    for _, x := range a {
        c ^= int(x)
    }
    return c == 0
}

func Hash(s []S) []byte {
    var b bytes.Buffer
    gob.NewEncoder(&b).Encode(s)
    return b.Bytes()
}
Run Code Online (Sandbox Code Playgroud)


小智 11

也许https://github.com/mitchellh/hashstruct可以帮助你。它始终对结构进行哈希处理,但可以与切片和数组一起使用。

  • 请阅读 https://stackoverflow.com/help/how-to-answer 和 https://stackoverflow.com/help/deleted-answers 并改进您的答案。链接不是有效答案。 (5认同)