2 * Copyright (C) 2010 Brian Aker
5 * Use and distribution licensed under the BSD license. See
6 * the COPYING file in the parent directory for full text.
9 #include <libhashkit/common.h>
11 static hashkit_return_t
_set_function(struct hashkit_st::hashkit_function_st
*self
, hashkit_hash_algorithm_t hash_algorithm
)
15 return HASHKIT_INVALID_ARGUMENT
;
18 switch (hash_algorithm
)
20 case HASHKIT_HASH_MD5
:
21 self
->function
= hashkit_md5
;
24 case HASHKIT_HASH_CRC
:
25 self
->function
= hashkit_crc32
;
28 case HASHKIT_HASH_FNV1_64
:
29 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
))
39 self
->function
= hashkit_fnv1a_64
;
42 return HASHKIT_INVALID_ARGUMENT
;
44 case HASHKIT_HASH_FNV1_32
:
45 self
->function
= hashkit_fnv1_32
;
48 case HASHKIT_HASH_FNV1A_32
:
49 self
->function
= hashkit_fnv1a_32
;
52 case HASHKIT_HASH_HSIEH
:
53 if (libhashkit_has_algorithm(HASHKIT_HASH_HSIEH
))
55 self
->function
= hashkit_hsieh
;
58 return HASHKIT_INVALID_ARGUMENT
;
60 case HASHKIT_HASH_MURMUR3
:
61 if (libhashkit_has_algorithm(HASHKIT_HASH_MURMUR3
))
63 self
->function
= hashkit_murmur3
;
66 return HASHKIT_INVALID_ARGUMENT
;
67 case HASHKIT_HASH_MURMUR
:
68 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
)
98 return _set_function(&self
->base_hash
, hash_algorithm
);
101 hashkit_return_t
hashkit_set_distribution_function(hashkit_st
*self
, hashkit_hash_algorithm_t hash_algorithm
)
103 return _set_function(&self
->distribution_hash
, hash_algorithm
);
106 static hashkit_return_t
_set_custom_function(struct hashkit_st::hashkit_function_st
*self
, hashkit_hash_fn function
, void *context
)
110 return HASHKIT_INVALID_ARGUMENT
;
115 self
->function
= function
;
116 self
->context
= context
;
118 return HASHKIT_SUCCESS
;
121 return HASHKIT_FAILURE
;
124 hashkit_return_t
hashkit_set_custom_function(hashkit_st
*self
, hashkit_hash_fn function
, void *context
)
128 return HASHKIT_INVALID_ARGUMENT
;
132 return _set_custom_function(&self
->base_hash
, function
, context
);
135 hashkit_return_t
hashkit_set_custom_distribution_function(hashkit_st
*self
, hashkit_hash_fn function
, void *context
)
139 return HASHKIT_INVALID_ARGUMENT
;
142 return _set_custom_function(&self
->distribution_hash
, function
, context
);
145 static hashkit_hash_algorithm_t
get_function_type(const hashkit_hash_fn function
)
147 if (function
== hashkit_one_at_a_time
)
149 return HASHKIT_HASH_DEFAULT
;
151 else if (function
== hashkit_md5
)
153 return HASHKIT_HASH_MD5
;
155 else if (function
== hashkit_crc32
)
157 return HASHKIT_HASH_CRC
;
159 else if (function
== hashkit_fnv1_64
)
161 return HASHKIT_HASH_FNV1_64
;
163 else if (function
== hashkit_fnv1a_64
)
165 return HASHKIT_HASH_FNV1A_64
;
167 else if (function
== hashkit_fnv1_32
)
169 return HASHKIT_HASH_FNV1_32
;
171 else if (function
== hashkit_fnv1a_32
)
173 return HASHKIT_HASH_FNV1A_32
;
175 else if (function
== hashkit_hsieh
)
177 return HASHKIT_HASH_HSIEH
;
179 else if (function
== hashkit_murmur
)
181 return HASHKIT_HASH_MURMUR
;
183 else if (function
== hashkit_murmur3
)
185 return HASHKIT_HASH_MURMUR3
;
187 else if (function
== hashkit_jenkins
)
189 return HASHKIT_HASH_JENKINS
;
192 return HASHKIT_HASH_CUSTOM
;
195 hashkit_hash_algorithm_t
hashkit_get_function(const hashkit_st
*self
)
199 return HASHKIT_HASH_DEFAULT
;
202 return get_function_type(self
->base_hash
.function
);
205 hashkit_hash_algorithm_t
hashkit_get_distribution_function(const hashkit_st
*self
)
209 return HASHKIT_HASH_DEFAULT
;
212 return get_function_type(self
->distribution_hash
.function
);