mirror of
https://git.gfz-potsdam.de/naaice/poet.git
synced 2025-12-15 20:38:23 +01:00
95 lines
2.5 KiB
C++
95 lines
2.5 KiB
C++
/*
|
|
**-----------------------------------------------------------------------------
|
|
** MurmurHash2 was written by Austin Appleby, and is placed in the public
|
|
** domain. The author hereby disclaims copyright to this source code.
|
|
**-----------------------------------------------------------------------------
|
|
**
|
|
** Copyright (C) 2018-2021 Alexander Lindemann, Max Luebke (University of
|
|
** Potsdam)
|
|
**
|
|
** Copyright (C) 2018-2022 Marco De Lucia, Max Luebke (GFZ Potsdam)
|
|
**
|
|
** POET is free software; you can redistribute it and/or modify it under the
|
|
** terms of the GNU General Public License as published by the Free Software
|
|
** Foundation; either version 2 of the License, or (at your option) any later
|
|
** version.
|
|
**
|
|
** POET is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
** WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
** A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License along with
|
|
** this program; if not, write to the Free Software Foundation, Inc., 51
|
|
** Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include "HashFunctions.hpp"
|
|
|
|
#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)
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// MurmurHash2, 64-bit versions, by Austin Appleby
|
|
|
|
// The same caveats as 32-bit MurmurHash2 apply here - beware of alignment
|
|
// and endian-ness issues if used across multiple platforms.
|
|
|
|
// 64-bit hash for 64-bit platforms
|
|
// objsize: 0x170-0x321: 433
|
|
|
|
uint64_t poet::Murmur2_64A(int len, const void *key) {
|
|
const uint64_t m = BIG_CONSTANT(0xc6a4a7935bd1e995);
|
|
const int r = 47;
|
|
|
|
uint64_t h = HASH_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;
|
|
case 6:
|
|
h ^= uint64_t(data2[5]) << 40;
|
|
case 5:
|
|
h ^= uint64_t(data2[4]) << 32;
|
|
case 4:
|
|
h ^= uint64_t(data2[3]) << 24;
|
|
case 3:
|
|
h ^= uint64_t(data2[2]) << 16;
|
|
case 2:
|
|
h ^= uint64_t(data2[1]) << 8;
|
|
case 1:
|
|
h ^= uint64_t(data2[0]);
|
|
h *= m;
|
|
};
|
|
|
|
h ^= h >> r;
|
|
h *= m;
|
|
h ^= h >> r;
|
|
|
|
return h;
|
|
}
|