【发布时间】:2018-06-23 12:27:45
【问题描述】:
我想从一个结构数组中生成一个唯一的散列。顺序可能不同,但值相同。
例子:
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"} }}
在这两种情况下,哈希值应该相同,因为结构内的值是相同的。
编辑:基本上这个想法是为缓存生成一个唯一的哈希!我想组合每个结构的单独哈希!
【问题讨论】:
-
地图在设计上是无序的。使用数组来保持顺序。
-
不清楚你在问什么。你想散列结构的 slice (不是数组),还是散列单个结构?最好问问为什么。您要检查内容是否相等(无论顺序如何),还是要校验和?请澄清。
-
基本上这个想法是为缓存生成一个唯一的哈希!我想组合每个结构的单独哈希!
-
因此您需要包含无序数据结构的复杂数据结构的哈希值。实现这一点的最快方法是序列化您的数据(对字段进行排序)并使用足够大的东西对其进行哈希处理以避免冲突。但是,我严重怀疑您的缓存需要在整个数据上,它通常在一个非常有限的子集上(例如:有人查询唯一 ID 并获取大量数据。这意味着您的缓存键是唯一 ID,而不是数据)。