如果我在语言"GO“中生成SHA-256哈希,我会得到一个与Java等价的不同的字节数组。
这是围棋版本:
fmt.Println(getSha256([]byte("5nonce=5")))生成的数组如下所示:
41 79 186 235 199 123 95 226 16 59 51 161 112 245 192 50 21 66 180 250 179 109 153 18 233 148 16 237 156 69 163 150]这个应该在Java代码中做同样的事情:
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update("5nonce=5".getBytes());
byte[] digest = md.digest();但是结果是这个字节数组
[41, 79, -70, -21, -57, 123, 95, -30, 16, 59, 51, -95, 112, -11, -64, 50, 21, 66, -76, -6, -77, 109, -103, 18, -23, -108, 16, -19, -100, 69, -93, -106]他们为什么不一样?如何将java版本更改为与Go版本完全相同的工作方式?
发布于 2014-06-27 22:28:50
他们为什么不一样?
他们不是真的。他们是同一批人。只是Java没有无符号字节--因此,任何具有顶部位集的字节都是负的。在任何情况下,您都会看到Java结果= Go结果- 256。
如果将两个字节数组转换为十六进制或base64,则会看到相同的结果。
发布于 2014-06-28 07:00:14
这是围棋代码将产生相同的结果:
package main
import "fmt"
import "crypto/sha256"
func main() {
sum224 := sha256.Sum256([]byte("5nonce=5"))
s := make([]int8, sha256.Size)
for i := range sum224 {
s[i] = int8(sum224[i])
}
fmt.Printf("%d", s)
}
[41 79 -70 -21 -57 123 95 -30 16 59 51 -95 112 -11 -64 50 21 66 -76 -6 -77 109 -103 18 -23 -108 16 -19 -100 69 -93 -106]fmt医生的确提到:
没有“
u”标志。如果整数具有无符号类型,则打印为无符号。
因为数值类型定义了:
byte别名用于uint8uint8所有无符号8位整数的集合(0到255)int8所有有符号8位整数的集合(-128到127)这就是为什么您需要将byte (无签名)转换为签名的int8才能看到相同的结果。
如果添加base64编码(请参阅高朗游乐场),则可以更容易地比较结果:
import "encoding/base64"
res := base64.StdEncoding.EncodeToString([]byte(sum224[:]))
fmt.Println(res)返回:
KU+668d7X+IQOzOhcPXAMhVCtPqzbZkS6ZQQ7ZxFo5Y=https://stackoverflow.com/questions/24461629
复制相似问题