shared: use union instead of _nm_alignas() for static hash-seed
We want the the hash-seed array is alined so it can be used both as guint, guint32, and guint64 directly. Don't use _nm_alignas() but instead just add the fields to the union so we get proper alignment. While at at, also let the seed argument to c_siphash_init() be aligned to 64 integers. c_siphash_init() does not require that, but it tries to read the seed as (unaligned) LE 64 bit integers. So, it doesn't hurt.
This commit is contained in:
@@ -45,7 +45,10 @@ _get_hash_key_init (void)
|
|||||||
* to use it as guint* or guint64* pointer. */
|
* to use it as guint* or guint64* pointer. */
|
||||||
static union {
|
static union {
|
||||||
guint8 v8[HASH_KEY_SIZE];
|
guint8 v8[HASH_KEY_SIZE];
|
||||||
} g_arr _nm_alignas (guint64);
|
guint _align_as_uint;
|
||||||
|
guint32 _align_as_uint32;
|
||||||
|
guint64 _align_as_uint64;
|
||||||
|
} g_arr;
|
||||||
const guint8 *g;
|
const guint8 *g;
|
||||||
union {
|
union {
|
||||||
guint8 v8[HASH_KEY_SIZE];
|
guint8 v8[HASH_KEY_SIZE];
|
||||||
@@ -125,14 +128,17 @@ void
|
|||||||
nm_hash_siphash42_init (CSipHash *h, guint static_seed)
|
nm_hash_siphash42_init (CSipHash *h, guint static_seed)
|
||||||
{
|
{
|
||||||
const guint8 *g;
|
const guint8 *g;
|
||||||
guint seed[HASH_KEY_SIZE_GUINT];
|
union {
|
||||||
|
guint64 _align_as_uint64;
|
||||||
|
guint arr[HASH_KEY_SIZE_GUINT];
|
||||||
|
} seed;
|
||||||
|
|
||||||
nm_assert (h);
|
nm_assert (h);
|
||||||
|
|
||||||
g = _get_hash_key ();
|
g = _get_hash_key ();
|
||||||
memcpy (seed, g, HASH_KEY_SIZE);
|
memcpy (&seed, g, HASH_KEY_SIZE);
|
||||||
seed[0] ^= static_seed;
|
seed.arr[0] ^= static_seed;
|
||||||
c_siphash_init (h, (const guint8 *) seed);
|
c_siphash_init (h, (const guint8 *) &seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
guint
|
guint
|
||||||
|
@@ -34,7 +34,7 @@ void nm_hash_siphash42_init (CSipHash *h, guint static_seed);
|
|||||||
*
|
*
|
||||||
* Note, that this is guaranteed to use siphash42 under the hood (contrary to
|
* Note, that this is guaranteed to use siphash42 under the hood (contrary to
|
||||||
* all other NMHash API, which leave this undefined). That matters at the point,
|
* all other NMHash API, which leave this undefined). That matters at the point,
|
||||||
* where the caller needs to be sure that a reasonably strong hasing algorithm
|
* where the caller needs to be sure that a reasonably strong hashing algorithm
|
||||||
* is used. (Yes, NMHash is all about siphash24, but otherwise that is not promised
|
* is used. (Yes, NMHash is all about siphash24, but otherwise that is not promised
|
||||||
* anywhere).
|
* anywhere).
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user