xref: /openbsd-src/gnu/llvm/compiler-rt/lib/sanitizer_common/sanitizer_hash.h (revision 810390e339a5425391477d5d41c78d7cab2424ac)
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