我正在实现一些加密函数,其中需要散列操作(我想计算自定义结构的散列)所以我想使用crypto
golang包中的SHA256散列函数。但是,我注意到当我为同一输入多次运行哈希函数时,它会返回不同的值。我的理解是SHA函数为单个输入值返回相同的哈希输出。下面是我对哈希函数的实现:
func myHash(s MyStruct) []byte{
bytes := []byte(fmt.Sprintf("%v", s))
h := sha256.New()
h.Write(bytes)
return h.Sum(nil)
}
myStruct
包含以下字段:
type MyStruct struct {
elliptic.Curve // I use elliptic.P224() as my curve
X, Y, Z *big.Int
}
对于相同的输入值SInput
,myHash函数的输出运行多次如下:
[38 39 88 96 46 192 74 20 93 238 4 18 134 253 238 154 210 89 64 204 13 27 60 78 228 33 57 20 173 80 67 196]
[38 39 88 96 46 192 74 20 93 238 4 18 134 253 238 154 210 89 64 204 13 27 60 78 228 33 57 20 173 80 67 196]
[38 39 88 96 46 192 74 20 93 238 4 18 134 253 238 154 210 89 64 204 13 27 60 78 228 33 57 20 173 80 67 196]
[172 219 215 153 250 30 31 136 175 47 25 178 231 84 90 173 31 130 136 131 169 23 98 198 198 109 255 76 228 134 100 191]
[31 114 57 247 85 214 151 174 124 255 5 200 17 200 198 107 105 56 53 126 233 242 228 74 17 87 238 7 136 100 80 160]
[38 39 88 96 46 192 74 20 93 238 4 18 134 253 238 154 210 89 64 204 13 27 60 78 228 33 57 20 173 80 67 196]
[38 39 88 96 46 192 74 20 93 238 4 18 134 253 238 154 210 89 64 204 13 27 60 78 228 33 57 20 173 80 67 196]
[38 39 88 96 46 192 74 20 93 238 4 18 134 253 238 154 210 89 64 204 13 27 60 78 228 33 57 20 173 80 67 196]
[38 39 88 96 46 192 74 20 93 238 4 18 134 253 238 154 210 89 64 204 13 27 60 78 228 33 57 20 173 80 67 196]
[172 219 215 153 250 30 31 136 175 47 25 178 231 84 90 173 31 130 136 131 169 23 98 198 198 109 255 76 228 134 100 191]
[172 219 215 153 250 30 31 136 175 47 25 178 231 84 90 173 31 130 136 131 169 23 98 198 198 109 255 76 228 134 100 191]
[38 39 88 96 46 192 74 20 93 238 4 18 134 253 238 154 210 89 64 204 13 27 60 78 228 33 57 20 173 80 67 196]
我做错了什么?
答案 0 :(得分:5)
当你调用fmt.Sprintf("%v")
并传递指针(包括指针的结构字段,例如P224 Curve包含)时,它会打印地址,而不是值。因为每次运行的地址都不同,所以每次运行都会得到不同的哈希值。尝试使用确定性的东西,它将更适合于目的 - 也许是JSON或Gob,或者编写自己的简单序列化器。