为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 golang 中将 sha3 哈希转换为大整数

如何在 golang 中将 sha3 哈希转换为大整数

Go
萧十郎 2022-08-30 21:58:12
我使用sha3生成了一个哈希值,我需要将其转换为大值。整型值。可能吗?或者有没有一种方法可以获得哈希的整数值?下面的代码引发无法转换类型哈希的错误。键入 int64 的哈希值:package main import ("math/big""golang.org/x/crypto/sha3""fmt")func main(){  chall := "hello word"  b := byte[](chall)  h := sha3.New244()  h.Write(chall)  h.Write(b)  d := make([]byte, 16)  h.Sum(d)  val := big.NewInt(int64(h))  fmt.Println(val)}
查看完整描述

2 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

sha3.New224()不能用 uint64 类型表示。


有许多哈希类型 - 并且大小不同。Go标准库选择一个非常通用的接口来涵盖所有类型的哈希:https://golang.org/pkg/hash/#Hash


type Hash interface {

    io.Writer

    Sum(b []byte) []byte

    Reset()

    Size() int

    BlockSize() int

}

话虽如此,一些Go哈希实现可以选择性地包括额外的方法,如哈希。哈希64:


type Hash64 interface {

    Hash

    Sum64() uint64

}

其他人可以实现编码。BinaryMarshaler:


type BinaryMarshaler interface {

    MarshalBinary() (data []byte, err error)

}

可以用来保留哈希状态。


sha3.New224()不实现上述 2 个接口,但哈希实现。要执行运行时检查,请执行以下操作:crc64


h64, ok := h.(hash.Hash64)

if ok {

    fmt.Printf("64-bit: %d\n", h64.Sum64())

}

工作示例:https://play.golang.org/p/uLUfw0gMZka


查看完整回答
反对 回复 2022-08-30
?
手掌心

TA贡献1942条经验 获得超3个赞

(有关更简单的版本,请参阅彼得的评论。

将一系列字节解释为 a 与将一系列十进制数字解释为任意大数字相同。例如,要将数字 1234 转换为“数字”,请执行以下操作:big.Int

  • 从 0 开始

  • 乘以 10 = 0

  • 加 1 = 1

  • 乘以 10 = 10

  • 加 2 = 12

  • 乘以 10 = 120

  • 加 3 = 123

  • 乘以 10 = 1230

  • 加 4 = 1234

这同样适用于字节。“数字”只是以256为基数,而不是以10为基数:

val := big.NewInt(0)for i := 0; i < h.Size(); i++ {
    val.Lsh(val, 8)
    val.Add(val, big.NewInt(int64(d[i])))
}

(Lsh是左移。左移 8 位与乘以 256 相同。


查看完整回答
反对 回复 2022-08-30
  • 2 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信