如果你放弃使用sha256.Sum256()函数,你可以避免复制,你首先通过调用sha256.New()创建一个hash.Hash。
使用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() 打印结果,这样我们就有了一个“真实”的结果来比较。然后我调用并打印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() 是最好的选择。如果您确实需要提高性能,您可以选择“克隆”sha256 包,在您的克隆版本中,您可以修改Sum256() 函数以接收可以直接存储结果的切片(我链接的其他答案显示了迈出的第一步),但说真的,复制 32 字节(SHA-256 摘要的大小)是如此之快,不值得麻烦,而且性能提升不会很大。
查看相关问题:How to efficiently hash (SHA 256) in golang data where only the last few bytes changes