猿问

连接 []byte 和哈希

我有类似的东西


unixtime := time.Now().Unix()


unixtimeStr := string(unixtime)


soup := make([]byte, len(data) + len(nonce) + len(unixtimeStr) + len(previousHash))


copy(soup[:], data)

copy(soup[len(data):], nonce)

copy(soup[len(data) + len(nonce):], []byte(unixtimeStr))

copy(soup[len(data) + len(nonce) + len(unixtimeStr):], previousHash)


hasher := sha1.New()

hasher.Write(soup)

var hash []byte = hasher.Sum(nil)

data, nonce,previousHash属于 类型[]byte。


我觉得它很脏而且不可读!


我想要一种更面向对象的编码风格,比如


soup := data.concat(nonce).concat([]byte(unixtimeStr)).concat(previousHash)

或者至少是类似的东西


soup := concat(data, nonce, ...)

你会如何写这个片段?


一只甜甜圈
浏览 131回答 2
2回答

有只小跳蛙

例如,var data, nonce, previousHash []byteunixtime := strconv.FormatInt(time.Now().Unix(), 10)hasher := sha1.New()hasher.Write(data)hasher.Write(nonce)hasher.Write([]byte(unixtime))hasher.Write(previousHash)hash := hasher.Sum(nil)或者,var data, nonce, previousHash []byteunixtime := strconv.FormatInt(time.Now().Unix(), 10)soup := make([]byte, 0, len(data)+len(nonce)+len(unixtime)+len(previousHash))soup = append(soup, data...)soup = append(soup, nonce...)soup = append(soup, unixtime...)soup = append(soup, previousHash...)hasher := sha1.New()hasher.Write(soup)hash := hasher.Sum(nil)笔记:unixtime := time.Now().Unix()unixtimeStr := string(unixtime)是荒谬的。它始终是 Unicode 替换字符。例如,package mainimport (    "fmt"    "time"    "unicode")func main() {    unixtime := time.Now().Unix()    unixtimeStr := string(unixtime)    fmt.Println(unixtimeStr == string(unicode.ReplacementChar))}输出:true要将整数转换为字符串,请使用strconv包。例如,package mainimport (    "fmt"    "strconv"    "time")func main() {    unixtimeStr := strconv.FormatInt(time.Now().Unix(), 10)    fmt.Println(unixtimeStr)}输出:1257894000

呼唤远方

我应该指出这hash.Hash是一个io.Writer所以你可以将它作为第一个参数传递给fmt.Fprintf(...)-- 并且,由于字节切片的动词fmt是正确的%s,你可以通过以下方式使其更具可读性:h := sha1.New() fmt.Fprintf(h, "%s%s%d%s", data, nonce, time.Now().Unix(), prev)...并且,它也为您处理整数转换(使用%d)注意:fmt.Fprintf(...)不是很快;如果性能很重要,你应该找到另一种方法来做到这一点。性能和可读性通常是一个微妙的平衡。
随时随地看视频慕课网APP

相关分类

Go
我要回答