13cab2bb3Spatrick //===-- sanitizer_common.h --------------------------------------*- C++ -*-===// 23cab2bb3Spatrick // 33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63cab2bb3Spatrick // 73cab2bb3Spatrick //===----------------------------------------------------------------------===// 83cab2bb3Spatrick // 93cab2bb3Spatrick // This file implements a simple hash function. 103cab2bb3Spatrick //===----------------------------------------------------------------------===// 113cab2bb3Spatrick 123cab2bb3Spatrick #ifndef SANITIZER_HASH_H 133cab2bb3Spatrick #define SANITIZER_HASH_H 143cab2bb3Spatrick 153cab2bb3Spatrick #include "sanitizer_internal_defs.h" 163cab2bb3Spatrick 173cab2bb3Spatrick namespace __sanitizer { 183cab2bb3Spatrick class MurMur2HashBuilder { 193cab2bb3Spatrick static const u32 m = 0x5bd1e995; 203cab2bb3Spatrick static const u32 seed = 0x9747b28c; 213cab2bb3Spatrick static const u32 r = 24; 223cab2bb3Spatrick u32 h; 233cab2bb3Spatrick 243cab2bb3Spatrick public: 253cab2bb3Spatrick explicit MurMur2HashBuilder(u32 init = 0) { h = seed ^ init; } add(u32 k)263cab2bb3Spatrick void add(u32 k) { 273cab2bb3Spatrick k *= m; 283cab2bb3Spatrick k ^= k >> r; 293cab2bb3Spatrick k *= m; 303cab2bb3Spatrick h *= m; 313cab2bb3Spatrick h ^= k; 323cab2bb3Spatrick } get()333cab2bb3Spatrick u32 get() { 343cab2bb3Spatrick u32 x = h; 353cab2bb3Spatrick x ^= x >> 13; 363cab2bb3Spatrick x *= m; 373cab2bb3Spatrick x ^= x >> 15; 383cab2bb3Spatrick return x; 393cab2bb3Spatrick } 403cab2bb3Spatrick }; 41*810390e3Srobert 42*810390e3Srobert class MurMur2Hash64Builder { 43*810390e3Srobert static const u64 m = 0xc6a4a7935bd1e995ull; 44*810390e3Srobert static const u64 seed = 0x9747b28c9747b28cull; 45*810390e3Srobert static const u64 r = 47; 46*810390e3Srobert u64 h; 47*810390e3Srobert 48*810390e3Srobert public: 49*810390e3Srobert explicit MurMur2Hash64Builder(u64 init = 0) { h = seed ^ (init * m); } add(u64 k)50*810390e3Srobert void add(u64 k) { 51*810390e3Srobert k *= m; 52*810390e3Srobert k ^= k >> r; 53*810390e3Srobert k *= m; 54*810390e3Srobert h ^= k; 55*810390e3Srobert h *= m; 56*810390e3Srobert } get()57*810390e3Srobert u64 get() { 58*810390e3Srobert u64 x = h; 59*810390e3Srobert x ^= x >> r; 60*810390e3Srobert x *= m; 61*810390e3Srobert x ^= x >> r; 62*810390e3Srobert return x; 63*810390e3Srobert } 64*810390e3Srobert }; 653cab2bb3Spatrick } //namespace __sanitizer 663cab2bb3Spatrick 673cab2bb3Spatrick #endif // SANITIZER_HASH_H 68