From e02db8ea22d545749ecaf3be9d342cc565bc143a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=A4=96=E4=B9=8B=E7=A5=9E?= Date: Mon, 10 Oct 2022 23:58:27 +0800 Subject: [PATCH] Add tests for hash collisions in simple cases --- glib/tests/hash.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/glib/tests/hash.c b/glib/tests/hash.c index 32d357979..604dcc049 100644 --- a/glib/tests/hash.c +++ b/glib/tests/hash.c @@ -459,6 +459,19 @@ int64_hash_test (void) g_hash_table_destroy (h); } +static void +int64_hash_collision_test (void) +{ + gint64 m; + gint64 n; + + g_test_summary ("Check int64 Hash collisions caused by ignoring high word"); + + m = 722; + n = ((gint64) 2003 << 32) + 722; + g_assert_cmpuint (g_int64_hash (&m), !=, g_int64_hash (&n)); +} + static void double_hash_test (void) { @@ -488,6 +501,27 @@ double_hash_test (void) g_hash_table_destroy (h); } +static void +double_hash_collision_test (void) +{ + gdouble m; + gdouble n; + + g_test_summary ("Check double Hash collisions caused by int conversion " \ + "and by numbers larger than 2^64-1 (G_MAXUINT64)"); + g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2771"); + + /* Equal when directly converted to integers */ + m = 0.1; + n = 0.2; + g_assert_cmpuint (g_double_hash (&m), !=, g_double_hash (&n)); + + /* Numbers larger than 2^64-1 (G_MAXUINT64) */ + m = 1e100; + n = 1e200; + g_assert_cmpuint (g_double_hash (&m), !=, g_double_hash (&n)); +} + static void string_free (gpointer data) { @@ -1715,7 +1749,9 @@ main (int argc, char *argv[]) g_test_add_func ("/hash/direct2", direct_hash_test2); g_test_add_func ("/hash/int", int_hash_test); g_test_add_func ("/hash/int64", int64_hash_test); + g_test_add_func ("/hash/int64/collisions", int64_hash_collision_test); g_test_add_func ("/hash/double", double_hash_test); + g_test_add_func ("/hash/double/collisions", double_hash_collision_test); g_test_add_func ("/hash/string", string_hash_test); g_test_add_func ("/hash/set", set_hash_test); g_test_add_func ("/hash/set-ref", set_ref_hash_test);