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 回复

仍在学习Go语言的技巧……非常感谢!

更多关于Golang中如何对结构体进行双重哈希处理的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


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函数中,使代码更加清晰和可重用。

回到顶部