Serenity Operating System
at master 45 lines 857 B view raw
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}