如何将 sha3 哈希转换为 golang 中的大整数
How to convert an sha3 hash to an big integer in golang
我使用 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)
}
TL;DR;
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()
没有实现上面两个接口,但是 crc64
hash 实现了。
要进行运行时检查:
h64, ok := h.(hash.Hash64)
if ok {
fmt.Printf("64-bit: %d\n", h64.Sum64())
}
(请参阅 Peter 的评论以获得更简单的版本。)
将一系列字节解释为 big.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。)
我使用 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)
}
TL;DR;
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()
没有实现上面两个接口,但是 crc64
hash 实现了。
要进行运行时检查:
h64, ok := h.(hash.Hash64)
if ok {
fmt.Printf("64-bit: %d\n", h64.Sum64())
}
(请参阅 Peter 的评论以获得更简单的版本。)
将一系列字节解释为 big.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。)