Unsafe: efficiently comparing two byte arrays
Florian Weimer
fweimer at redhat.com
Thu Feb 27 14:09:27 UTC 2014
On 02/27/2014 11:37 AM, Paul Sandoz wrote:
> /*
> * We want to compare only the first index where left[index] != right[index].
> * This corresponds to the least significant nonzero byte in lw ^ rw, since lw
> * and rw are little-endian. Long.numberOfTrailingZeros(diff) tells us the least
> * significant nonzero bit, and zeroing out the first three bits of L.nTZ gives us the
> * shift to get that least significant nonzero byte.
> */
> int n = Long.numberOfTrailingZeros(lw ^ rw) & ~0x7;
> return (int) (((lw >>> n) & UNSIGNED_MASK) - ((rw >>> n) & UNSIGNED_MASK));
This really depends on the microarchitecture, but for many current CPUs,
conversion to big endian with Long::reverseBytes(long) will be faster
(assuming that it's intrinsified).
This is not just a performance optimization, it can also be used to plug
an alleged timing oracle:
<https://sourceware.org/ml/libc-alpha/2014-01/msg00763.html>
--
Florian Weimer / Red Hat Product Security Team
More information about the core-libs-dev
mailing list