chm*_*ike 3 arrays sha256 go slice
我正在使用哈希函数sha256.Sum256(data []byte) [sha256.Size]byte.我需要将返回的摘要存储在另一个更大的数组的末尾.
var x [sha256.BlockSize+sha256.Size]byte
? = sha256.Sum256(data)
Run Code Online (Sandbox Code Playgroud)
到目前为止我找到的唯一解决方案如下:
var x [sha256.BlockSize+sha256.Size]byte
var d = sha256.Sum256(data)
copy(x[sha256.BlockSize:], d[:])
Run Code Online (Sandbox Code Playgroud)
可以避免这个副本吗?
如果您放弃使用该sha256.Sum256()功能,则可以避免复制,并且首先hash.Hash通过调用创建sha256.New().
使用a 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])
Run Code Online (Sandbox Code Playgroud)
请参阅此示例以演示它:
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)
Run Code Online (Sandbox Code Playgroud)
首先我使用打印结果,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:
您表示必须在每个Web请求中执行此操作.在这种情况下,可能使用sha256.Sum256()是最好的选择.如果你确实需要提高性能,你可以选择"克隆" sha256软件包,在你的克隆版本中,你可以修改Sum256()函数来接收一个可以直接存储结果的切片(我的链接其他答案显示了第一步)但是,严重的是,复制32个字节(SHA-256摘要的大小)是如此之快,不值得麻烦,并且性能增益不会很大.
请参阅相关问题:如何在golang数据中有效地散列(SHA 256),其中只有最后几个字节发生变化