diff options
author | Thomas Haller <thaller@redhat.com> | 2017-11-15 15:33:32 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-11-15 16:27:39 +0100 |
commit | cecc8852e7ca1096eab1fda21195410aa60c7da5 (patch) | |
tree | c37d2848f732562d612407cd4bcf4f8476198cb5 | |
parent | c6ea7271dbd7cf6275396c1d9d224c344eccd29c (diff) | |
download | NetworkManager-cecc8852e7ca1096eab1fda21195410aa60c7da5.tar.gz |
shared: use siphash24() for nm_hash_ptr()
siphash24() mixes the bits much better then our naive xor.
Don't bypass siphash24(). We supposedly use it for the
better hashing properties, so use it also for pointers.
-rw-r--r-- | libnm-core/tests/test-general.c | 4 | ||||
-rw-r--r-- | shared/nm-utils/nm-hash-utils.c | 15 |
2 files changed, 10 insertions, 9 deletions
diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c index 0529d07d1f..4294e5e833 100644 --- a/libnm-core/tests/test-general.c +++ b/libnm-core/tests/test-general.c @@ -175,6 +175,10 @@ test_nm_hash (void) g_assert (nm_hash_str ("")); g_assert (nm_hash_str ("a")); + g_assert (nm_hash_ptr (NULL)); + g_assert (nm_hash_ptr ("")); + g_assert (nm_hash_ptr ("a")); + _test_hash_str (""); _test_hash_str ("a"); _test_hash_str ("aa"); diff --git a/shared/nm-utils/nm-hash-utils.c b/shared/nm-utils/nm-hash-utils.c index 9a39656642..bf2a93ebc8 100644 --- a/shared/nm-utils/nm-hash-utils.c +++ b/shared/nm-utils/nm-hash-utils.c @@ -133,16 +133,13 @@ nm_str_hash (gconstpointer str) guint nm_hash_ptr (gconstpointer ptr) { - guint h; - - h = ((const guint *) _get_hash_key ())[0]; - - if (sizeof (ptr) <= sizeof (guint)) - h = h ^ ((guint) ((uintptr_t) ptr)); - else - h = h ^ ((guint) (((guint64) (uintptr_t) ptr) >> 32)) ^ ((guint) ((uintptr_t) ptr)); + NMHashState h; - return h ?: 2907677551u; + if (!ptr) + return nm_hash_static (2907677551u); + nm_hash_init (&h, 2907677551u); + nm_hash_update (&h, &ptr, sizeof (ptr)); + return nm_hash_complete (&h); } guint |