Объединить [] байт и хеш - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть что-то вроде

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 ]

0 голосов
/ 10 февраля 2019

Я должен отметить, что 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)

(Обязательно Go Playground Ссылка)

Примечание: fmt.Fprintf(...) не очень быстро;если производительность важна, вы должны найти другой способ сделать это.Производительность и удобочитаемость часто представляют собой тонкий баланс.

0 голосов
/ 09 февраля 2019

Например,

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)

бессмысленно.Это всегда символ замены Юникода.Например,

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...