diff options
author | Thomas Haller <thaller@redhat.com> | 2017-11-15 15:33:32 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-11-16 11:49:51 +0100 |
commit | ecd106101bcdd9ac56aac8765bf828f7137cc7e3 (patch) | |
tree | 853208513f9fcae8e9c868f5b1b4027d10296eff | |
parent | c3d98a3df6432f3d9d143dec6d328feec0873b4a (diff) | |
download | NetworkManager-ecd106101bcdd9ac56aac8765bf828f7137cc7e3.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 0d0ba373a1..e4daf1a07c 100644 --- a/shared/nm-utils/nm-hash-utils.c +++ b/shared/nm-utils/nm-hash-utils.c @@ -143,16 +143,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 |