projects
/
awesomized
/
libmemcached
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
|
github
raw
|
patch
|
inline
| side by side (from parent 1:
14b09f5
)
attempt to fix murmur on big endian
author
Michael Wallner
<mike@php.net>
Tue, 13 Oct 2020 21:14:50 +0000
(23:14 +0200)
committer
Michael Wallner
<mike@php.net>
Tue, 13 Oct 2020 21:14:50 +0000
(23:14 +0200)
src/libhashkit/murmur.cc
patch
|
blob
|
history
diff --git
a/src/libhashkit/murmur.cc
b/src/libhashkit/murmur.cc
index a2ff52163113582b181dd602c8a8e583e2ef894c..614b8a5567c5776457aad4e3036a550b198936e2 100644
(file)
--- a/
src/libhashkit/murmur.cc
+++ b/
src/libhashkit/murmur.cc
@@
-1,5
+1,5
@@
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
- *
+ *
* HashKit library
*
* Copyright (C) 2011-2012 Data Differential, http://datadifferential.com/
* HashKit library
*
* Copyright (C) 2011-2012 Data Differential, http://datadifferential.com/
@@
-81,8
+81,16
@@
uint32_t hashkit_murmur(const char *key, size_t length, void *context)
while(length >= 4)
{
while(length >= 4)
{
- unsigned int k;
- memcpy(&k, data, sizeof(unsigned int));
+ uint32_t k;
+#if WORDS_BIGENDIAN
+ k = (data[0]<<24)
+ + (data[1]<<16)
+ + (data[2]<<8)
+ + (data[3])
+ ;
+#else
+ memcpy(&k, data, sizeof(k));
+#endif
k *= m;
k ^= k >> r;
k *= m;
k ^= k >> r;
@@
-99,9
+107,15
@@
uint32_t hashkit_murmur(const char *key, size_t length, void *context)
switch(length)
{
switch(length)
{
+#if WORDS_BIGENDIAN
+ case 3: h ^= ((uint32_t)data[2]) << 8; /* fall through */
+ case 2: h ^= ((uint32_t)data[1]) << 16; /* fall through */
+ case 1: h ^= ((uint32_t)data[0]) << 24;
+#else
case 3: h ^= ((uint32_t)data[2]) << 16; /* fall through */
case 2: h ^= ((uint32_t)data[1]) << 8; /* fall through */
case 1: h ^= data[0];
case 3: h ^= ((uint32_t)data[2]) << 16; /* fall through */
case 2: h ^= ((uint32_t)data[1]) << 8; /* fall through */
case 1: h ^= data[0];
+#endif
h *= m;
default: break;
};
h *= m;
default: break;
};