为了账号安全,请及时绑定邮箱和手机立即绑定

连接 []byte 和哈希

连接 []byte 和哈希

Go
一只甜甜圈 2023-06-05 18:05:54
我有类似的东西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, ...)你会如何写这个片段?
查看完整描述

2 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

例如,


var data, nonce, previousHash []byte


unixtime := 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 []byte


unixtime := 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 main


import (

    "fmt"

    "time"

    "unicode"

)


func main() {

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

    unixtimeStr := string(unixtime)

    fmt.Println(unixtimeStr == string(unicode.ReplacementChar))

}

输出:


true

要将整数转换为字符串,请使用strconv包。例如,


package main


import (

    "fmt"

    "strconv"

    "time"

)


func main() {

    unixtimeStr := strconv.FormatInt(time.Now().Unix(), 10)

    fmt.Println(unixtimeStr)

}

输出:


1257894000


查看完整回答
反对 回复 2023-06-05
?
呼唤远方

TA贡献1856条经验 获得超11个赞

我应该指出这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(...)不是很快;如果性能很重要,你应该找到另一种方法来做到这一点。性能和可读性通常是一个微妙的平衡。


查看完整回答
反对 回复 2023-06-05
  • 2 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信