Fix --x-initial and --x-assign random stability (#2662) (#5958) (#6018) (#6025)

This commit is contained in:
Todd Strader
2025-05-27 09:31:55 -04:00
committed by GitHub
parent e84fe36518
commit 4b041c636f
37 changed files with 692 additions and 48 deletions
+43
View File
@@ -342,6 +342,49 @@ string VString::aOrAn(const char* word) {
}
}
// MurmurHash64A
uint64_t VString::hashMurmur(const string& str) VL_PURE {
const char* key = str.c_str();
const size_t len = str.size();
const uint64_t seed = 0;
const uint64_t m = 0xc6a4a7935bd1e995ULL;
const int r = 47;
uint64_t h = seed ^ (len * m);
const uint64_t* data = (const uint64_t*)key;
const uint64_t* end = data + (len / 8);
while (data != end) {
uint64_t k = *data++;
k *= m;
k ^= k >> r;
k *= m;
h ^= k;
h *= m;
}
const unsigned char* data2 = (const unsigned char*)data;
switch (len & 7) {
case 7: h ^= uint64_t(data2[6]) << 48; /* fallthrough */
case 6: h ^= uint64_t(data2[5]) << 40; /* fallthrough */
case 5: h ^= uint64_t(data2[4]) << 32; /* fallthrough */
case 4: h ^= uint64_t(data2[3]) << 24; /* fallthrough */
case 3: h ^= uint64_t(data2[2]) << 16; /* fallthrough */
case 2: h ^= uint64_t(data2[1]) << 8; /* fallthrough */
case 1: h ^= uint64_t(data2[0]); h *= m; /* fallthrough */
};
h ^= h >> r;
h *= m;
h ^= h >> r;
return h;
}
//######################################################################
// VHashSha256