连接[] byte和哈希

时间:2019-02-09 20:22:17

标签: go

我有类似的东西

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)

datanoncepreviousHash类型为[]byte

我发现它是如此肮脏且不可读!

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

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

或至少类似

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

您如何编写此代码段?

2 个答案:

答案 0 :(得分:2)

例如,

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

答案 1 :(得分:0)

我应该指出,hash.Hashio.Writer,因此您可以将其作为第一个参数传递给fmt.Fprintf(...),并且由于fmt会执行使用其%s动词对字节片进行正确处理,您可以通过以下方式使它更具可读性:

h := sha1.New()
fmt.Fprintf(h, "%s%s%d%s", data, nonce, time.Now().Unix(), prev)

...而且,它也为您(使用%d)照顾了整数转换

(强制性Go Playground链接)

注意:fmt.Fprintf(...)的运行速度并不快;如果性能很重要,则应该找到另一种方法。性能和可读性通常是微妙的平衡。