Golang中如何对结构体进行双重哈希处理
Golang中如何对结构体进行双重哈希处理 你好,我有一个简单的结构体,如果第一次哈希的结果是偶数,我想计算它的双重哈希,否则只计算一次哈希。我目前的代码如下:
package main
import (
"fmt"
"math/big"
"golang.org/x/crypto/blake2b"
)
type Person struct {
FirstName string
LastName string
}
func main() {
var p = Person{"firstnamefirstnamefirstnamefirstname", "lastnamelastnamelastnamelastnamelastname"}
s := fmt.Sprintf("%v", p)
hash := blake2b.Sum256([]byte(s))
zz := new(big.Int)
zz.SetBytes(hash[:])
fmt.Printf("%T\n", zz)
fmt.Println(zz)
fmt.Printf("%T\n", zz.Bytes)
if zz.Bit(0) == 0 {
hash = blake2b.Sum256(zz.Bytes)
}
}
但是我在最后一行遇到了一个错误:
cannot use zz.Bytes (type func() []byte) as type []byte in argument to blake2b.Sum256
我不确定如何修复它,有人能帮忙吗?先谢谢了…
更多关于Golang中如何对结构体进行双重哈希处理的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
zz.Bytes 是一个函数(方法),因此你需要加上括号。
hash = blake2b.Sum256(zz.Bytes())
hash = blake2b.Sum256(zz.Bytes())
在Go语言中,big.Int.Bytes是一个方法(method),而不是字段(field)。你需要调用这个方法才能获取字节切片。以下是修复后的代码:
package main
import (
"fmt"
"math/big"
"golang.org/x/crypto/blake2b"
)
type Person struct {
FirstName string
LastName string
}
func main() {
var p = Person{"firstnamefirstnamefirstnamefirstname", "lastnamelastnamelastnamelastnamelastname"}
s := fmt.Sprintf("%v", p)
hash := blake2b.Sum256([]byte(s))
zz := new(big.Int)
zz.SetBytes(hash[:])
fmt.Printf("%T\n", zz)
fmt.Println(zz)
fmt.Printf("%T\n", zz.Bytes)
if zz.Bit(0) == 0 {
// 调用Bytes()方法获取字节切片
hash = blake2b.Sum256(zz.Bytes())
}
fmt.Printf("Final hash: %x\n", hash)
}
关键修复在第24行:将zz.Bytes改为zz.Bytes()。big.Int.Bytes()方法返回大整数的绝对值的字节表示,以大端序排列。
如果你需要完整的双重哈希处理示例,这里是一个更完整的实现:
package main
import (
"fmt"
"math/big"
"golang.org/x/crypto/blake2b"
)
type Person struct {
FirstName string
LastName string
}
func hashPerson(p Person) [32]byte {
// 第一次哈希
s := fmt.Sprintf("%v", p)
hash := blake2b.Sum256([]byte(s))
// 检查最低位是否为偶数
zz := new(big.Int)
zz.SetBytes(hash[:])
if zz.Bit(0) == 0 {
// 第二次哈希
hash = blake2b.Sum256(zz.Bytes())
}
return hash
}
func main() {
p := Person{
FirstName: "firstnamefirstnamefirstnamefirstname",
LastName: "lastnamelastnamelastnamelastnamelastname",
}
result := hashPerson(p)
fmt.Printf("Hash result: %x\n", result)
}
这个实现将双重哈希逻辑封装在hashPerson函数中,使代码更加清晰和可重用。

