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-15 16:27:39 +0100
commitcecc8852e7ca1096eab1fda21195410aa60c7da5 (patch)
treec37d2848f732562d612407cd4bcf4f8476198cb5
parentc6ea7271dbd7cf6275396c1d9d224c344eccd29c (diff)
downloadNetworkManager-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.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 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