aboutsummaryrefslogtreecommitdiff
path: root/libraries/murmur2/src/MurmurHash2.cpp
diff options
context:
space:
mode:
authorflow <flowlnlnln@gmail.com>2022-06-03 19:02:11 -0300
committerflow <flowlnlnln@gmail.com>2022-07-17 11:33:41 -0300
commit32a9545360b10058cf84b951ee88959adf3bf374 (patch)
tree6a7f55747945f6beec5582767ce102f219f84f82 /libraries/murmur2/src/MurmurHash2.cpp
parent9a44c9221139428fa4e3bdf560f6bfdc6fcbe75d (diff)
downloadPrismLauncher-32a9545360b10058cf84b951ee88959adf3bf374.tar.gz
PrismLauncher-32a9545360b10058cf84b951ee88959adf3bf374.tar.bz2
PrismLauncher-32a9545360b10058cf84b951ee88959adf3bf374.zip
libs: add murmur2 library
Signed-off-by: flow <flowlnlnln@gmail.com>
Diffstat (limited to 'libraries/murmur2/src/MurmurHash2.cpp')
-rw-r--r--libraries/murmur2/src/MurmurHash2.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/libraries/murmur2/src/MurmurHash2.cpp b/libraries/murmur2/src/MurmurHash2.cpp
new file mode 100644
index 00000000..3e52e6d1
--- /dev/null
+++ b/libraries/murmur2/src/MurmurHash2.cpp
@@ -0,0 +1,86 @@
+//-----------------------------------------------------------------------------
+// MurmurHash2 was written by Austin Appleby, and is placed in the public
+// domain. The author hereby disclaims copyright to this source code.
+
+// Note - This code makes a few assumptions about how your machine behaves -
+
+// 1. We can read a 4-byte value from any address without crashing
+// 2. sizeof(int) == 4
+
+// And it has a few limitations -
+
+// 1. It will not work incrementally.
+// 2. It will not produce the same results on little-endian and big-endian
+// machines.
+
+#include "MurmurHash2.h"
+
+//-----------------------------------------------------------------------------
+// Platform-specific functions and macros
+
+// Microsoft Visual Studio
+
+#if defined(_MSC_VER)
+
+#define BIG_CONSTANT(x) (x)
+
+// Other compilers
+
+#else // defined(_MSC_VER)
+
+#define BIG_CONSTANT(x) (x##LLU)
+
+#endif // !defined(_MSC_VER)
+
+//-----------------------------------------------------------------------------
+
+uint64_t MurmurHash2 ( const void* key, int len, uint32_t seed )
+{
+ // 'm' and 'r' are mixing constants generated offline.
+ // They're not really 'magic', they just happen to work well.
+
+ const uint32_t m = 0x5bd1e995;
+ const int r = 24;
+
+ // Initialize the hash to a 'random' value
+
+ uint32_t h = seed ^ len;
+
+ // Mix 4 bytes at a time into the hash
+ const auto* data = (const unsigned char*) key;
+ while(len >= 4)
+ {
+ uint32_t k = *(uint32_t*)data;
+
+ k *= m;
+ k ^= k >> r;
+ k *= m;
+
+ h *= m;
+ h ^= k;
+
+ data += 4*sizeof(char);
+ len -= 4;
+ }
+
+ // Handle the last few bytes of the input array
+
+ switch(len)
+ {
+ case 3: h ^= data[2] << 16;
+ case 2: h ^= data[1] << 8;
+ case 1: h ^= data[0];
+ h *= m;
+ };
+
+ // Do a few final mixes of the hash to ensure the last few
+ // bytes are well-incorporated.
+
+ h ^= h >> 13;
+ h *= m;
+ h ^= h >> 15;
+
+ return h;
+}
+
+//-----------------------------------------------------------------------------