如何在Go中将数组的一部分转换为数组?

时间:2017-09-21 12:59:28

标签: arrays go slice sha256

我正在使用哈希函数sha256.Sum256(data []byte) [sha256.Size]byte。 我需要将返回的摘要存储在另一个更大的数组的末尾。

var x [sha256.BlockSize+sha256.Size]byte 
? = sha256.Sum256(data)

我到目前为止找到的唯一解决方案如下:

var x [sha256.BlockSize+sha256.Size]byte 
var d = sha256.Sum256(data)
copy(x[sha256.BlockSize:], d[:]) 

是否可以避免此副本?

1 个答案:

答案 0 :(得分:5)

如果您放弃使用sha256.Sum256()功能,则可以避免复制,并且首先通过调用hash.Hash创建sha256.New()

使用hash.Hash您可以使用Hash.Sum()方法计算摘要,这里重要的是您可以将切片传递给它,表明您希望附加结果那个。

对于目标切片,您可以传递一个切片值,该切片值指向您想要结果的x数组中的元素,例如: 0长度(结果将附加到此切片,而不是填入其中):

var x [sha256.BlockSize+sha256.Size]byte
h := sha256.New()
h.Write(data)
h.Sum(x[sha256.BlockSize:sha256.BlockSize])

请参阅此示例以演示它:

data := []byte("hello")
fmt.Println(sha256.Sum256(data))

var x [sha256.BlockSize + sha256.Size]byte
h := sha256.New()
h.Write(data)
res := h.Sum(x[sha256.BlockSize:sha256.BlockSize])
fmt.Println(res)
fmt.Println(x)

首先,我使用sha256.Sum256()打印结果,因此我们有一个"正宗"导致comapre到。然后我调用并打印Hash.Sum()的结果。最后我们打印x数组以验证结果是否在其中。

输出(在Go Playground上尝试):

[44 242 77 186 95 176 163 14 38 232 59 42 197 185 226 158 27 22 30 92 31 167 66 94 115 4 51 98 147 139 152 36] [44 242 77 186 95 176 163 14 38 232 59 42 197 185 226 158 27 22 30 92 31 167 66 94 115 4 51 98 147 139 152 36] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 242 77 186 95 176 163 14 38 232 59 42 197 185 226 158 27 22 30 92 31 167 66 94 115 4 51 98 147 139 152 36]

<强>更新

你写道,你知道这一点,但故意避免这种情况,以避免分配hash.Hash。知道sha256.Sum256()使用了sha256.New()引用的相同实现,因此这个解决方案很可能不会慢(没有基准测试)。 你也可以重用哈希!所以事实上这可以更快。要重复使用,请调用Hash.Reset()方法。

更新#2:

您表示您必须在每个网络请求中执行此操作。在这种情况下,使用sha256.Sum256()可能是最佳选择。如果你确实需要提高性能,你可以选择克隆&#34; sha256包,在您的克隆版本中,您可以修改Sum256()函数以接收可以直接存储结果的切片(我的链接其他答案显示了向此迈出的第一步),但严重的是,复制32个字节(SHA-256摘要的大小)是如此之快,不值得麻烦,性能提升也不会很大。

请参阅相关问题:How to efficiently hash (SHA 256) in golang data where only the last few bytes changes