2 +--------------------------------------------------------------------+
3 | libmemcached - C/C++ Client Library for memcached |
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted under the terms of the BSD license. |
7 | You should have received a copy of the license in a bundled file |
8 | named LICENSE; in case you did not receive a copy you can review |
9 | the terms online at: https://opensource.org/licenses/BSD-3-Clause |
10 +--------------------------------------------------------------------+
11 | Copyright (c) 2006-2014 Brian Aker https://datadifferential.com/ |
12 | Copyright (c) 2020 Michael Wallner <mike@php.net> |
13 +--------------------------------------------------------------------+
16 #include "libhashkit/common.h"
18 static hashkit_return_t
_set_function(struct hashkit_st::hashkit_function_st
*self
,
19 hashkit_hash_algorithm_t hash_algorithm
) {
21 return HASHKIT_INVALID_ARGUMENT
;
24 switch (hash_algorithm
) {
25 case HASHKIT_HASH_MD5
: self
->function
= hashkit_md5
; break;
27 case HASHKIT_HASH_CRC
: self
->function
= hashkit_crc32
; break;
29 case HASHKIT_HASH_FNV1_64
:
30 if (libhashkit_has_algorithm(HASHKIT_HASH_FNV1_64
)) {
31 self
->function
= hashkit_fnv1_64
;
34 return HASHKIT_INVALID_ARGUMENT
;
36 case HASHKIT_HASH_FNV1A_64
:
37 if (libhashkit_has_algorithm(HASHKIT_HASH_FNV1_64
)) {
38 self
->function
= hashkit_fnv1a_64
;
41 return HASHKIT_INVALID_ARGUMENT
;
43 case HASHKIT_HASH_FNV1_32
: self
->function
= hashkit_fnv1_32
; break;
45 case HASHKIT_HASH_FNV1A_32
: self
->function
= hashkit_fnv1a_32
; break;
47 case HASHKIT_HASH_HSIEH
:
48 if (libhashkit_has_algorithm(HASHKIT_HASH_HSIEH
)) {
49 self
->function
= hashkit_hsieh
;
52 return HASHKIT_INVALID_ARGUMENT
;
54 case HASHKIT_HASH_MURMUR3
:
55 if (libhashkit_has_algorithm(HASHKIT_HASH_MURMUR3
)) {
56 self
->function
= hashkit_murmur3
;
59 return HASHKIT_INVALID_ARGUMENT
;
60 case HASHKIT_HASH_MURMUR
:
61 if (libhashkit_has_algorithm(HASHKIT_HASH_MURMUR
)) {
62 self
->function
= hashkit_murmur
;
65 return HASHKIT_INVALID_ARGUMENT
;
67 case HASHKIT_HASH_JENKINS
: self
->function
= hashkit_jenkins
; break;
69 case HASHKIT_HASH_CUSTOM
: return HASHKIT_INVALID_ARGUMENT
;
71 case HASHKIT_HASH_DEFAULT
: self
->function
= hashkit_one_at_a_time
; break;
73 case HASHKIT_HASH_MAX
: self
->function
= hashkit_one_at_a_time
; return HASHKIT_INVALID_HASH
;
78 return HASHKIT_SUCCESS
;
81 hashkit_return_t
hashkit_set_function(hashkit_st
*self
, hashkit_hash_algorithm_t hash_algorithm
) {
82 return _set_function(&self
->base_hash
, hash_algorithm
);
85 hashkit_return_t
hashkit_set_distribution_function(hashkit_st
*self
,
86 hashkit_hash_algorithm_t hash_algorithm
) {
87 return _set_function(&self
->distribution_hash
, hash_algorithm
);
90 static hashkit_return_t
_set_custom_function(struct hashkit_st::hashkit_function_st
*self
,
91 hashkit_hash_fn function
, void *context
) {
93 return HASHKIT_INVALID_ARGUMENT
;
97 self
->function
= function
;
98 self
->context
= context
;
100 return HASHKIT_SUCCESS
;
103 return HASHKIT_FAILURE
;
106 hashkit_return_t
hashkit_set_custom_function(hashkit_st
*self
, hashkit_hash_fn function
,
109 return HASHKIT_INVALID_ARGUMENT
;
112 return _set_custom_function(&self
->base_hash
, function
, context
);
115 hashkit_return_t
hashkit_set_custom_distribution_function(hashkit_st
*self
,
116 hashkit_hash_fn function
, void *context
) {
118 return HASHKIT_INVALID_ARGUMENT
;
121 return _set_custom_function(&self
->distribution_hash
, function
, context
);
124 static hashkit_hash_algorithm_t
get_function_type(const hashkit_hash_fn function
) {
125 if (function
== hashkit_one_at_a_time
) {
126 return HASHKIT_HASH_DEFAULT
;
127 } else if (function
== hashkit_md5
) {
128 return HASHKIT_HASH_MD5
;
129 } else if (function
== hashkit_crc32
) {
130 return HASHKIT_HASH_CRC
;
131 } else if (function
== hashkit_fnv1_64
) {
132 return HASHKIT_HASH_FNV1_64
;
133 } else if (function
== hashkit_fnv1a_64
) {
134 return HASHKIT_HASH_FNV1A_64
;
135 } else if (function
== hashkit_fnv1_32
) {
136 return HASHKIT_HASH_FNV1_32
;
137 } else if (function
== hashkit_fnv1a_32
) {
138 return HASHKIT_HASH_FNV1A_32
;
139 } else if (function
== hashkit_hsieh
) {
140 return HASHKIT_HASH_HSIEH
;
141 } else if (function
== hashkit_murmur
) {
142 return HASHKIT_HASH_MURMUR
;
143 } else if (function
== hashkit_murmur3
) {
144 return HASHKIT_HASH_MURMUR3
;
145 } else if (function
== hashkit_jenkins
) {
146 return HASHKIT_HASH_JENKINS
;
149 return HASHKIT_HASH_CUSTOM
;
152 hashkit_hash_algorithm_t
hashkit_get_function(const hashkit_st
*self
) {
154 return HASHKIT_HASH_DEFAULT
;
157 return get_function_type(self
->base_hash
.function
);
160 hashkit_hash_algorithm_t
hashkit_get_distribution_function(const hashkit_st
*self
) {
162 return HASHKIT_HASH_DEFAULT
;
165 return get_function_type(self
->distribution_hash
.function
);