-1

我使用 sha3 生成了一个哈希值,我需要将其转换为 big.Int 值。是否可以 ?或者有没有一种方法来获取哈希的整数值?

以下代码引发了一个错误,无法将 hash.Hash 类型转换为 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)

}


4

2 回答 2

1

TL;博士;

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 哈希实现可以选择包含额外的方法,例如hash.Hash64

type Hash64 interface {
    Hash
    Sum64() uint64
}

其他人可以实现encoding.BinaryMarshaler

type BinaryMarshaler interface {
    MarshalBinary() (data []byte, err error)
}

可以用来保存哈希状态。

sha3.New224() 没有实现上述 2 个接口,但是crc64hash 实现了。要进行运行时检查:

h64, ok := h.(hash.Hash64)
if ok {
    fmt.Printf("64-bit: %d\n", h64.Sum64())
}

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

于 2021-05-20T13:56:34.933 回答
1

(请参阅彼得的评论以获得更简单的版本。)

将一系列字节解释为 abig.Int与将一系列十进制数字解释为任意大数相同。例如,要将数字 1234 转换为“数字”,您可以这样做:

  • 从 0 开始
  • 乘以 10 = 0
  • 加 1 = 1
  • 乘以 10 = 10
  • 加 2 = 12
  • 乘以 10 = 120
  • 加 3 = 123
  • 乘以 10 = 1230
  • 加 4 = 1234

这同样适用于字节。“数字”只是 base-256 而不是 base-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 相同。)

操场

于 2021-05-20T14:01:20.940 回答