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
:
26 self
->function
= hashkit_md5
;
29 case HASHKIT_HASH_CRC
:
30 self
->function
= hashkit_crc32
;
33 case HASHKIT_HASH_FNV1_64
:
34 if (libhashkit_has_algorithm(HASHKIT_HASH_FNV1_64
)) {
35 self
->function
= hashkit_fnv1_64
;
38 return HASHKIT_INVALID_ARGUMENT
;
40 case HASHKIT_HASH_FNV1A_64
:
41 if (libhashkit_has_algorithm(HASHKIT_HASH_FNV1_64
)) {
42 self
->function
= hashkit_fnv1a_64
;
45 return HASHKIT_INVALID_ARGUMENT
;
47 case HASHKIT_HASH_FNV1_32
:
48 self
->function
= hashkit_fnv1_32
;
51 case HASHKIT_HASH_FNV1A_32
:
52 self
->function
= hashkit_fnv1a_32
;
55 case HASHKIT_HASH_HSIEH
:
56 if (libhashkit_has_algorithm(HASHKIT_HASH_HSIEH
)) {
57 self
->function
= hashkit_hsieh
;
60 return HASHKIT_INVALID_ARGUMENT
;
62 case HASHKIT_HASH_MURMUR3
:
63 if (libhashkit_has_algorithm(HASHKIT_HASH_MURMUR3
)) {
64 self
->function
= hashkit_murmur3
;
67 return HASHKIT_INVALID_ARGUMENT
;
68 case HASHKIT_HASH_MURMUR
:
69 if (libhashkit_has_algorithm(HASHKIT_HASH_MURMUR
)) {
70 self
->function
= hashkit_murmur
;
73 return HASHKIT_INVALID_ARGUMENT
;
75 case HASHKIT_HASH_JENKINS
:
76 self
->function
= hashkit_jenkins
;
79 case HASHKIT_HASH_CUSTOM
:
80 return HASHKIT_INVALID_ARGUMENT
;
82 case HASHKIT_HASH_DEFAULT
:
83 self
->function
= hashkit_one_at_a_time
;
86 case HASHKIT_HASH_MAX
:
87 self
->function
= hashkit_one_at_a_time
;
88 return HASHKIT_INVALID_HASH
;
93 return HASHKIT_SUCCESS
;
96 hashkit_return_t
hashkit_set_function(hashkit_st
*self
, hashkit_hash_algorithm_t hash_algorithm
) {
97 return _set_function(&self
->base_hash
, hash_algorithm
);
100 hashkit_return_t
hashkit_set_distribution_function(hashkit_st
*self
,
101 hashkit_hash_algorithm_t hash_algorithm
) {
102 return _set_function(&self
->distribution_hash
, hash_algorithm
);
105 static hashkit_return_t
_set_custom_function(struct hashkit_st::hashkit_function_st
*self
,
106 hashkit_hash_fn function
, void *context
) {
108 return HASHKIT_INVALID_ARGUMENT
;
112 self
->function
= function
;
113 self
->context
= context
;
115 return HASHKIT_SUCCESS
;
118 return HASHKIT_FAILURE
;
121 hashkit_return_t
hashkit_set_custom_function(hashkit_st
*self
, hashkit_hash_fn function
,
124 return HASHKIT_INVALID_ARGUMENT
;
127 return _set_custom_function(&self
->base_hash
, function
, context
);
130 hashkit_return_t
hashkit_set_custom_distribution_function(hashkit_st
*self
,
131 hashkit_hash_fn function
, void *context
) {
133 return HASHKIT_INVALID_ARGUMENT
;
136 return _set_custom_function(&self
->distribution_hash
, function
, context
);
139 static hashkit_hash_algorithm_t
get_function_type(const hashkit_hash_fn function
) {
140 if (function
== hashkit_one_at_a_time
) {
141 return HASHKIT_HASH_DEFAULT
;
142 } else if (function
== hashkit_md5
) {
143 return HASHKIT_HASH_MD5
;
144 } else if (function
== hashkit_crc32
) {
145 return HASHKIT_HASH_CRC
;
146 } else if (function
== hashkit_fnv1_64
) {
147 return HASHKIT_HASH_FNV1_64
;
148 } else if (function
== hashkit_fnv1a_64
) {
149 return HASHKIT_HASH_FNV1A_64
;
150 } else if (function
== hashkit_fnv1_32
) {
151 return HASHKIT_HASH_FNV1_32
;
152 } else if (function
== hashkit_fnv1a_32
) {
153 return HASHKIT_HASH_FNV1A_32
;
154 } else if (function
== hashkit_hsieh
) {
155 return HASHKIT_HASH_HSIEH
;
156 } else if (function
== hashkit_murmur
) {
157 return HASHKIT_HASH_MURMUR
;
158 } else if (function
== hashkit_murmur3
) {
159 return HASHKIT_HASH_MURMUR3
;
160 } else if (function
== hashkit_jenkins
) {
161 return HASHKIT_HASH_JENKINS
;
164 return HASHKIT_HASH_CUSTOM
;
167 hashkit_hash_algorithm_t
hashkit_get_function(const hashkit_st
*self
) {
169 return HASHKIT_HASH_DEFAULT
;
172 return get_function_type(self
->base_hash
.function
);
175 hashkit_hash_algorithm_t
hashkit_get_distribution_function(const hashkit_st
*self
) {
177 return HASHKIT_HASH_DEFAULT
;
180 return get_function_type(self
->distribution_hash
.function
);