aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorkwolekr <kwolekr@minetest.net>2013-09-17 02:57:10 -0400
committerkwolekr <kwolekr@minetest.net>2013-11-04 23:59:26 -0500
commite46c5277334e7435b74eedba7fdfe2c773f48d06 (patch)
tree9f5ebc7fc83d5436e1931f1118b76e021b2246d4 /src/util
parent1a96987d0fbbcf689825851ee282fe79e4658c02 (diff)
downloadminetest-e46c5277334e7435b74eedba7fdfe2c773f48d06.tar.gz
minetest-e46c5277334e7435b74eedba7fdfe2c773f48d06.tar.bz2
minetest-e46c5277334e7435b74eedba7fdfe2c773f48d06.zip
Accept hexadecimal and string values for seeds
Diffstat (limited to 'src/util')
-rw-r--r--src/util/numeric.cpp44
-rw-r--r--src/util/numeric.h2
-rw-r--r--src/util/string.cpp16
-rw-r--r--src/util/string.h1
4 files changed, 63 insertions, 0 deletions
diff --git a/src/util/numeric.cpp b/src/util/numeric.cpp
index 67df4ffba..0426656a5 100644
--- a/src/util/numeric.cpp
+++ b/src/util/numeric.cpp
@@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "../log.h"
#include "../constants.h" // BS, MAP_BLOCKSIZE
+#include <string.h>
#include <iostream>
// Calculate the borders of a "d-radius" cube
@@ -139,6 +140,49 @@ int myrand_range(int min, int max)
return (myrand()%(max-min+1))+min;
}
+// 64-bit unaligned version of MurmurHash
+u64 murmur_hash_64_ua(const void *key, int len, unsigned int seed)
+{
+ const u64 m = 0xc6a4a7935bd1e995;
+ const int r = 47;
+ u64 h = seed ^ (len * m);
+
+ const u64 *data = (const u64 *)key;
+ const u64 *end = data + (len / 8);
+
+ while (data != end) {
+ u64 k;
+ memcpy(&k, data, sizeof(u64));
+ 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 ^= (u64)data2[6] << 48;
+ case 6: h ^= (u64)data2[5] << 40;
+ case 5: h ^= (u64)data2[4] << 32;
+ case 4: h ^= (u64)data2[3] << 24;
+ case 3: h ^= (u64)data2[2] << 16;
+ case 2: h ^= (u64)data2[1] << 8;
+ case 1: h ^= (u64)data2[0];
+ h *= m;
+ }
+
+ h ^= h >> r;
+ h *= m;
+ h ^= h >> r;
+
+ return h;
+}
+
+
/*
blockpos: position of block in block coordinates
camera_pos: position of camera in nodes
diff --git a/src/util/numeric.h b/src/util/numeric.h
index b96c94faa..8e3a617ff 100644
--- a/src/util/numeric.h
+++ b/src/util/numeric.h
@@ -222,6 +222,8 @@ int myrand_range(int min, int max);
Miscellaneous functions
*/
+u64 murmur_hash_64_ua(const void *key, int len, unsigned int seed);
+
bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
f32 camera_fov, f32 range, f32 *distance_ptr=NULL);
diff --git a/src/util/string.cpp b/src/util/string.cpp
index 2c1dea497..a2312baf8 100644
--- a/src/util/string.cpp
+++ b/src/util/string.cpp
@@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "string.h"
#include "pointer.h"
+#include "numeric.h"
#include "../sha1.h"
#include "../base64.h"
@@ -136,3 +137,18 @@ char *mystrtok_r(char *s, const char *sep, char **lasts) {
*lasts = t;
return s;
}
+
+u64 read_seed(const char *str) {
+ char *endptr;
+ u64 num;
+
+ if (str[0] == '0' && str[1] == 'x')
+ num = strtoull(str, &endptr, 16);
+ else
+ num = strtoull(str, &endptr, 10);
+
+ if (*endptr)
+ num = murmur_hash_64_ua(str, (int)strlen(str), 0x1337);
+
+ return num;
+}
diff --git a/src/util/string.h b/src/util/string.h
index 7531600e3..81855962f 100644
--- a/src/util/string.h
+++ b/src/util/string.h
@@ -321,6 +321,7 @@ size_t curl_write_data(char *ptr, size_t size, size_t nmemb, void *userdata);
u32 readFlagString(std::string str, FlagDesc *flagdesc);
std::string writeFlagString(u32 flags, FlagDesc *flagdesc);
char *mystrtok_r(char *s, const char *sep, char **lasts);
+u64 read_seed(const char *str);
#endif