summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Krivonos <sergei.krivonos@mariadb.com>2021-11-03 14:06:55 +0200
committerSergei Krivonos <sergei.krivonos@mariadb.com>2021-11-03 14:06:55 +0200
commitf37c3217f307cba41180c37c1ca920aaaa4f793d (patch)
treed1f0c7a3641a7a83f5fbdcaed78baaf1a40373c4
parent2fef2534ed366d1616927c6436cad64ddb144661 (diff)
downloadmariadb-git-bb-10.4-MDEV-18477.tar.gz
MDEV-18477: add generic_hash_fnv1abb-10.4-MDEV-18477
-rw-r--r--include/hash.h9
-rw-r--r--mysys/hash.cc11
2 files changed, 20 insertions, 0 deletions
diff --git a/include/hash.h b/include/hash.h
index fd64bf4c5df..4c5b5a186c9 100644
--- a/include/hash.h
+++ b/include/hash.h
@@ -41,13 +41,22 @@ extern "C" {
#define HASH_UNIQUE 1 /* hash_insert fails on duplicate key */
#define HASH_THREAD_SPECIFIC 2 /* Mark allocated memory THREAD_SPECIFIC */
+
typedef uint32 my_hash_value_type;
typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool);
typedef my_hash_value_type (*my_hash_function)(CHARSET_INFO *,
const uchar *, size_t);
+/**
+ * @param ci - not used, for my_hash_function signature compatibility
+ * @param p - data
+ * @param sz - bytes count
+ */
+my_hash_value_type generic_hash_fnv1a(CHARSET_INFO *ci, const uchar *p, size_t sz);
+
typedef void (*my_hash_free_key)(void *);
typedef my_bool (*my_hash_walk_action)(void *,void *);
+
typedef struct st_hash {
size_t key_offset,key_length; /* Length of key if const length */
size_t blength;
diff --git a/mysys/hash.cc b/mysys/hash.cc
index d29297a5233..0ea8a802ef0 100644
--- a/mysys/hash.cc
+++ b/mysys/hash.cc
@@ -41,6 +41,17 @@ static void movelink(HASH_LINK *array,uint pos,uint next_link,uint newlink);
static int hashcmp(const HASH *hash, HASH_LINK *pos, const uchar *key,
size_t length);
+my_hash_value_type generic_hash_fnv1a(CHARSET_INFO *, const uchar *p, size_t sz)
+{
+ size_t result= static_cast<size_t>(14695981039346656037ULL);
+ for (; sz--; )
+ {
+ result ^= static_cast<size_t>(*p++);
+ result *= static_cast<size_t>(1099511628211ULL);
+ }
+ return static_cast<my_hash_value_type>(result);
+}
+
my_hash_value_type my_hash_sort(CHARSET_INFO *cs, const uchar *key,
size_t length)
{