Golang实现哈希算法需要哪些基础准备

Golang实现哈希算法需要哪些基础准备 在查看了 Go 语言中 hash、crypto/md5、crypto/sha256 的源码后,我必须承认对于如何开始编写自己的哈希算法感到有些困惑,因为现有的算法返回的是长整型/整型,而我需要返回字符串类型。任何指导都将不胜感激。

func main() {
    fmt.Println("hello world")
}
10 回复

你能分享一下你写的代码吗?

更多关于Golang实现哈希算法需要哪些基础准备的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我觉得我在这里取得了一些进展。Write 函数似乎是关键,但它的命名让我感到困惑 😉

正如我在上面的第一篇帖子中提到的,我已经查看了这些代码,但无法确定是哪个函数在处理输入数据以生成哈希值

我现在有了一个完全正常工作的新哈希算法。虽然过程并不那么复杂,但确实需要我进行大量的生成和测试工作。

我仍然不太确定您在寻找什么。但也许 crypto/sha256 的源代码可以帮助您。New 可能是一个不错的起点。

是的,我已经了解这一点,并使用它来计算某些数据的 md5/sha256 哈希值。
然而,我想编写一个自定义的哈希函数,它将实现与 md5/sha256 相同的接口,但执行我自己编写的其他计算,但我不知道如何实现这一点。

  • 不要自己编写加密算法,这会导致灾难性后果
  • 现有的库返回 hash.Hash。你指的是哪些返回数值类型的方法?
// 示例代码
func example() {
    // 这里可以放置Go代码示例
}

我不想自己编写加密算法,而是希望实现自己的哈希函数,该函数将使用与标准 md5/sha256 完全相同的实现方式,但返回的字符串/[]byte 值将代表我对输入的自定义哈希结果。CRC32、md5… 计算的是整型/长整型等数值,这些数值随后会转换为 []byte 作为哈希函数的返回值,因此我有了上述陈述。

你可以使用 fmt.Sprintf("%x", h.Sum(nil)) 来获取十六进制哈希值:

package main

import (
	"crypto/sha256"
	"fmt"
)

func main() {
	input := "The tunneling gopher digs downwards unaware of what he will find.\n"

	h := sha256.New()
	h.Write([]byte(input))

	s := fmt.Sprintf("%x", h.Sum(nil))
	fmt.Println(s)
}

输出:

b464e60d2682d09081510940d39496463b54e54f412156f39e44231fd53d7c0e

https://play.golang.com/p/J5y_HDXC_AF

在Go语言中实现自定义哈希算法时,通常需要理解哈希接口的设计和类型转换机制。现有的哈希算法(如MD5、SHA256)返回的是字节切片([]byte),而不是长整型/整型。您可以通过编码将字节切片转换为字符串类型。以下是实现的基本步骤和示例代码:

  1. 实现 hash.Hash 接口:自定义哈希结构需要实现 Write()Sum()Reset()Size()BlockSize() 方法。
  2. 返回字符串:在 Sum() 方法中返回字节切片,然后使用编码(如十六进制)转换为字符串。

以下是一个简单的自定义哈希算法示例,它返回输入数据的简单哈希值(这里使用累加字节值作为演示),并最终输出十六进制字符串:

package main

import (
    "encoding/hex"
    "fmt"
    "hash"
)

// 自定义哈希结构
type SimpleHash struct {
    sum uint32
}

// 实现 hash.Hash 接口的 Write 方法
func (s *SimpleHash) Write(p []byte) (n int, err error) {
    for _, b := range p {
        s.sum += uint32(b) // 简单累加字节值作为哈希计算
    }
    return len(p), nil
}

// 实现 Sum 方法,返回字节切片
func (s *SimpleHash) Sum(b []byte) []byte {
    // 将 uint32 转换为字节切片
    result := make([]byte, 4)
    result[0] = byte(s.sum >> 24)
    result[1] = byte(s.sum >> 16)
    result[2] = byte(s.sum >> 8)
    result[3] = byte(s.sum)
    if b != nil {
        return append(b, result...)
    }
    return result
}

// 实现 Reset 方法
func (s *SimpleHash) Reset() {
    s.sum = 0
}

// 实现 Size 方法
func (s *SimpleHash) Size() int {
    return 4 // 返回哈希值的字节长度
}

// 实现 BlockSize 方法
func (s *SimpleHash) BlockSize() int {
    return 1 // 返回块大小
}

// 辅助函数:计算哈希并返回十六进制字符串
func ComputeHashString(data []byte) string {
    h := &SimpleHash{}
    h.Write(data)
    hashBytes := h.Sum(nil)
    return hex.EncodeToString(hashBytes)
}

func main() {
    data := []byte("hello world")
    hashStr := ComputeHashString(data)
    fmt.Printf("Hash string: %s\n", hashStr) // 输出类似 "Hash string: 0000066d"
}

在这个示例中:

  • SimpleHash 结构实现了 hash.Hash 接口。
  • Write 方法处理输入数据并更新内部状态(这里简单累加字节值)。
  • Sum 方法返回哈希结果的字节切片。
  • ComputeHashString 函数使用 hex.EncodeToString 将字节切片转换为十六进制字符串。

您可以根据实际需求修改哈希逻辑(例如使用更复杂的算法替换简单的累加),但核心是通过实现接口和编码来返回字符串类型。

回到顶部