ladybird/Tests/AK/TestHashFunctions.cpp
Schlufi 55a7738837 AK: Use a full-period xorshift PRNG for double_hash
The previous implementation had some pretty short cycles and two fixed
points (1711463637 and 2389024350). If two keys hashed to one of these
values insertions and lookups would loop forever.
This version is based on a standard xorshift PRNG with period 2**32-1.
The all-zero state is usually forbidden, so we insert it into the cycle
at an arbitrary location.
2022-01-07 12:34:44 +01:00

63 lines
1.7 KiB
C++

/*
* Copyright (c) 2020, the SerenityOS developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibTest/TestCase.h>
#include <AK/HashFunctions.h>
#include <AK/Types.h>
TEST_CASE(int_hash)
{
static_assert(int_hash(42) == 3564735745u);
static_assert(int_hash(0) == 1177991625u);
}
TEST_CASE(double_hash)
{
static_assert(double_hash(666) == 171644115u);
static_assert(double_hash(0) == 1189591134u);
static_assert(double_hash(0xBA5EDB01) == 0u);
}
TEST_CASE(pair_int_hash)
{
static_assert(pair_int_hash(42, 17) == 339337046u);
static_assert(pair_int_hash(0, 0) == 954888656u);
}
TEST_CASE(u64_hash)
{
static_assert(u64_hash(42) == 2824066580u);
static_assert(u64_hash(0) == 954888656u);
}
TEST_CASE(ptr_hash)
{
// These tests are not static_asserts because the values are
// different and the goal is to bind the behavior.
if constexpr (sizeof(FlatPtr) == 8) {
EXPECT_EQ(ptr_hash(FlatPtr(42)), 2824066580u);
EXPECT_EQ(ptr_hash(FlatPtr(0)), 954888656u);
EXPECT_EQ(ptr_hash(reinterpret_cast<const void*>(42)), 2824066580u);
EXPECT_EQ(ptr_hash(reinterpret_cast<const void*>(0)), 954888656u);
} else {
EXPECT_EQ(ptr_hash(FlatPtr(42)), 3564735745u);
EXPECT_EQ(ptr_hash(FlatPtr(0)), 1177991625u);
EXPECT_EQ(ptr_hash(reinterpret_cast<const void*>(42)), 3564735745u);
EXPECT_EQ(ptr_hash(reinterpret_cast<const void*>(0)), 1177991625u);
}
}
TEST_CASE(constexpr_ptr_hash)
{
// This test does not check the result because the goal is just to
// ensure the function can be executed in a constexpr context. The
// "ptr_hash" test binds the result.
static_assert(ptr_hash(FlatPtr(42)));
}