]> Git Repo - VerusCoin.git/blob - src/hash.cpp
Merge pull request #4967
[VerusCoin.git] / src / hash.cpp
1 #include "hash.h"
2
3 inline uint32_t ROTL32(uint32_t x, int8_t r)
4 {
5     return (x << r) | (x >> (32 - r));
6 }
7
8 unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char>& vDataToHash)
9 {
10     // The following is MurmurHash3 (x86_32), see http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp
11     uint32_t h1 = nHashSeed;
12     if (vDataToHash.size() > 0)
13     {
14         const uint32_t c1 = 0xcc9e2d51;
15         const uint32_t c2 = 0x1b873593;
16
17         const int nblocks = vDataToHash.size() / 4;
18
19         //----------
20         // body
21         const uint32_t* blocks = (const uint32_t*)(&vDataToHash[0] + nblocks * 4);
22
23         for (int i = -nblocks; i; i++) {
24             uint32_t k1 = blocks[i];
25
26             k1 *= c1;
27             k1 = ROTL32(k1, 15);
28             k1 *= c2;
29
30             h1 ^= k1;
31             h1 = ROTL32(h1, 13);
32             h1 = h1 * 5 + 0xe6546b64;
33         }
34
35         //----------
36         // tail
37         const uint8_t* tail = (const uint8_t*)(&vDataToHash[0] + nblocks * 4);
38
39         uint32_t k1 = 0;
40
41         switch (vDataToHash.size() & 3) {
42         case 3:
43             k1 ^= tail[2] << 16;
44         case 2:
45             k1 ^= tail[1] << 8;
46         case 1:
47             k1 ^= tail[0];
48             k1 *= c1;
49             k1 = ROTL32(k1, 15);
50             k1 *= c2;
51             h1 ^= k1;
52         };
53     }
54
55     //----------
56     // finalization
57     h1 ^= vDataToHash.size();
58     h1 ^= h1 >> 16;
59     h1 *= 0x85ebca6b;
60     h1 ^= h1 >> 13;
61     h1 *= 0xc2b2ae35;
62     h1 ^= h1 >> 16;
63
64     return h1;
65 }
This page took 0.026062 seconds and 4 git commands to generate.