summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-11-15 15:33:32 +0100
committerThomas Haller <thaller@redhat.com>2017-11-16 11:49:51 +0100
commitecd106101bcdd9ac56aac8765bf828f7137cc7e3 (patch)
tree853208513f9fcae8e9c868f5b1b4027d10296eff
parentc3d98a3df6432f3d9d143dec6d328feec0873b4a (diff)
downloadNetworkManager-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.c4
-rw-r--r--shared/nm-utils/nm-hash-utils.c15
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