annotate libsanitizer/sanitizer_common/sanitizer_hash.h @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 //===-- sanitizer_common.h --------------------------------------*- C++ -*-===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 // This file implements a simple hash function.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 #ifndef SANITIZER_HASH_H
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 #define SANITIZER_HASH_H
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 #include "sanitizer_internal_defs.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 namespace __sanitizer {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 class MurMur2HashBuilder {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 static const u32 m = 0x5bd1e995;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 static const u32 seed = 0x9747b28c;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 static const u32 r = 24;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 u32 h;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 explicit MurMur2HashBuilder(u32 init = 0) { h = seed ^ init; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 void add(u32 k) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 k *= m;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 k ^= k >> r;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 k *= m;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 h *= m;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 h ^= k;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 u32 get() {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 u32 x = h;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 x ^= x >> 13;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 x *= m;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 x ^= x >> 15;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 return x;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 } //namespace __sanitizer
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 #endif // SANITIZER_HASH_H