我正在使用哈希函数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[:])
是否可以避免此副本?
答案 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