| //===-- sanitizer_common.h --------------------------------------*- C++ -*-===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // This file implements a simple hash function. | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef SANITIZER_HASH_H | 
 | #define SANITIZER_HASH_H | 
 |  | 
 | #include "sanitizer_internal_defs.h" | 
 |  | 
 | namespace __sanitizer { | 
 | class MurMur2HashBuilder { | 
 |   static const u32 m = 0x5bd1e995; | 
 |   static const u32 seed = 0x9747b28c; | 
 |   static const u32 r = 24; | 
 |   u32 h; | 
 |  | 
 |  public: | 
 |   explicit MurMur2HashBuilder(u32 init = 0) { h = seed ^ init; } | 
 |   void add(u32 k) { | 
 |     k *= m; | 
 |     k ^= k >> r; | 
 |     k *= m; | 
 |     h *= m; | 
 |     h ^= k; | 
 |   } | 
 |   u32 get() { | 
 |     u32 x = h; | 
 |     x ^= x >> 13; | 
 |     x *= m; | 
 |     x ^= x >> 15; | 
 |     return x; | 
 |   } | 
 | }; | 
 |  | 
 | class MurMur2Hash64Builder { | 
 |   static const u64 m = 0xc6a4a7935bd1e995ull; | 
 |   static const u64 seed = 0x9747b28c9747b28cull; | 
 |   static const u64 r = 47; | 
 |   u64 h; | 
 |  | 
 |  public: | 
 |   explicit MurMur2Hash64Builder(u64 init = 0) { h = seed ^ (init * m); } | 
 |   void add(u64 k) { | 
 |     k *= m; | 
 |     k ^= k >> r; | 
 |     k *= m; | 
 |     h ^= k; | 
 |     h *= m; | 
 |   } | 
 |   u64 get() { | 
 |     u64 x = h; | 
 |     x ^= x >> r; | 
 |     x *= m; | 
 |     x ^= x >> r; | 
 |     return x; | 
 |   } | 
 | }; | 
 | }  //namespace __sanitizer | 
 |  | 
 | #endif  // SANITIZER_HASH_H |