Golang - 将SHA1 Hex转换为Base 16 Integer

时间:2015-09-13 03:13:40

标签: go hex

我需要一些帮助将算法从Ruby移植到Go。

在Ruby中我有:

hex = Digest::SHA1.hexdigest(str).to_i(16)
hex.to_s(32)

创建SHA1十六进制字符串,将其转换为基数为16的整数,然后返回基数为32的字符串。

如何在Go中实现相同目标?

2 个答案:

答案 0 :(得分:6)

以下是一个示例代码(playground:https://play.golang.org/p/izBIq97-0S):

package main

import (
    "crypto/sha1"
    "encoding/base32"
    "fmt"
    "strings"
)

func main() {
    // Input
    exampleString := "example"

    // SHA1 hash
    hash := sha1.New()
    hash.Write([]byte(exampleString))
    hashBytes := hash.Sum(nil)

    // Conversion to base32
    base32str := strings.ToLower(base32.HexEncoding.EncodeToString(hashBytes))

    fmt.Println(base32str)
}

我测试了这个Ruby脚本并且输出匹配:

require 'digest'

str = "example"
hex = Digest::SHA1.hexdigest(str).to_i(16)

puts hex.to_s(32)

编辑:这是我的原始答案,它重现了ruby脚本中的每一步,但其中两个是不必要的(playground:https://play.golang.org/p/tyQt3ftb1j):

package main

import (
    "crypto/sha1"
    "encoding/base32"
    "encoding/hex"
    "fmt"
    "math/big"
    "strings"
)

func main() {
    // Input
    exampleString := "example"

    // SHA1 hash
    hash := sha1.New()
    hash.Write([]byte(exampleString))
    hashBytes := hash.Sum(nil)

    // Hexadecimal conversion
    hexSha1 := hex.EncodeToString(hashBytes)

    // Integer base16 conversion
    intBase16, success := new(big.Int).SetString(hexSha1, 16)
    if !success {
        panic("Failed parsing big Int from hex")
    }

    // Conversion to base32
    base32str := strings.ToLower(base32.HexEncoding.EncodeToString(intBase16.Bytes()))

    fmt.Println(base32str)
}

答案 1 :(得分:0)

尝试

h := sha1.New()
h.Write(content)
sha := h.Sum(nil)  // "sha" is uint8 type, encoded in base16

shaStr := hex.EncodeToString(sha)  // String representation

fmt.Printf("%x\n", sha)
fmt.Println(shaStr)

示例输出...

fcbc340d999e751840e17f862cc9eaf826cc6079
fcbc340d999e751840e17f862cc9eaf826cc6079