Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/Types.h>
10
11constexpr unsigned int_hash(u32 key)
12{
13 key += ~(key << 15);
14 key ^= (key >> 10);
15 key += (key << 3);
16 key ^= (key >> 6);
17 key += ~(key << 11);
18 key ^= (key >> 16);
19 return key;
20}
21
22constexpr unsigned pair_int_hash(u32 key1, u32 key2)
23{
24 return int_hash((int_hash(key1) * 209) ^ (int_hash(key2 * 413)));
25}
26
27constexpr unsigned u64_hash(u64 key)
28{
29 u32 first = key & 0xFFFFFFFF;
30 u32 last = key >> 32;
31 return pair_int_hash(first, last);
32}
33
34constexpr unsigned ptr_hash(FlatPtr ptr)
35{
36 if constexpr (sizeof(ptr) == 8)
37 return u64_hash(ptr);
38 else
39 return int_hash(ptr);
40}
41
42inline unsigned ptr_hash(void const* ptr)
43{
44 return ptr_hash(FlatPtr(ptr));
45}