mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 12:46:44 +00:00
common/bitutil: using subtle.XORBytes for optimization
This commit is contained in:
parent
5d51208334
commit
6646b42dd4
1 changed files with 2 additions and 26 deletions
|
|
@ -8,6 +8,7 @@
|
||||||
package bitutil
|
package bitutil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/subtle"
|
||||||
"runtime"
|
"runtime"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
@ -18,32 +19,7 @@ const supportsUnaligned = runtime.GOARCH == "386" || runtime.GOARCH == "amd64" |
|
||||||
// XORBytes xors the bytes in a and b. The destination is assumed to have enough
|
// XORBytes xors the bytes in a and b. The destination is assumed to have enough
|
||||||
// space. Returns the number of bytes xor'd.
|
// space. Returns the number of bytes xor'd.
|
||||||
func XORBytes(dst, a, b []byte) int {
|
func XORBytes(dst, a, b []byte) int {
|
||||||
if supportsUnaligned {
|
return subtle.XORBytes(dst, a, b)
|
||||||
return fastXORBytes(dst, a, b)
|
|
||||||
}
|
|
||||||
return safeXORBytes(dst, a, b)
|
|
||||||
}
|
|
||||||
|
|
||||||
// fastXORBytes xors in bulk. It only works on architectures that support
|
|
||||||
// unaligned read/writes.
|
|
||||||
func fastXORBytes(dst, a, b []byte) int {
|
|
||||||
n := len(a)
|
|
||||||
if len(b) < n {
|
|
||||||
n = len(b)
|
|
||||||
}
|
|
||||||
w := n / wordSize
|
|
||||||
if w > 0 {
|
|
||||||
dw := *(*[]uintptr)(unsafe.Pointer(&dst))
|
|
||||||
aw := *(*[]uintptr)(unsafe.Pointer(&a))
|
|
||||||
bw := *(*[]uintptr)(unsafe.Pointer(&b))
|
|
||||||
for i := 0; i < w; i++ {
|
|
||||||
dw[i] = aw[i] ^ bw[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for i := n - n%wordSize; i < n; i++ {
|
|
||||||
dst[i] = a[i] ^ b[i]
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// safeXORBytes xors one by one. It works on all architectures, independent if
|
// safeXORBytes xors one by one. It works on all architectures, independent if
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue