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.
11 uint32_t hashkit_generate_value(const hashkit_st
*self
, const char *key
, size_t key_length
)
13 return self
->base_hash
.function(key
, key_length
, self
->base_hash
.context
);
16 static hashkit_return_t
_set_function(struct hashkit_function_st
*self
, hashkit_hash_algorithm_t hash_algorithm
)
18 switch (hash_algorithm
)
20 case HASHKIT_HASH_DEFAULT
:
21 self
->function
= hashkit_one_at_a_time
;
23 case HASHKIT_HASH_MD5
:
24 self
->function
= hashkit_md5
;
26 case HASHKIT_HASH_CRC
:
27 self
->function
= hashkit_crc32
;
29 case HASHKIT_HASH_FNV1_64
:
30 self
->function
= hashkit_fnv1_64
;
32 case HASHKIT_HASH_FNV1A_64
:
33 self
->function
= hashkit_fnv1a_64
;
35 case HASHKIT_HASH_FNV1_32
:
36 self
->function
= hashkit_fnv1_32
;
38 case HASHKIT_HASH_FNV1A_32
:
39 self
->function
= hashkit_fnv1a_32
;
41 case HASHKIT_HASH_HSIEH
:
42 #ifdef HAVE_HSIEH_HASH
43 self
->function
= hashkit_hsieh
;
46 return HASHKIT_FAILURE
;
48 case HASHKIT_HASH_MURMUR
:
49 self
->function
= hashkit_murmur
;
51 case HASHKIT_HASH_JENKINS
:
52 self
->function
= hashkit_jenkins
;
54 case HASHKIT_HASH_CUSTOM
:
55 case HASHKIT_HASH_MAX
:
57 return HASHKIT_FAILURE
;
63 return HASHKIT_SUCCESS
;
66 hashkit_return_t
hashkit_set_function(hashkit_st
*self
, hashkit_hash_algorithm_t hash_algorithm
)
68 return _set_function(&self
->base_hash
, hash_algorithm
);
71 hashkit_return_t
hashkit_set_distribution_function(hashkit_st
*self
, hashkit_hash_algorithm_t hash_algorithm
)
73 return _set_function(&self
->distribution_hash
, hash_algorithm
);
76 static hashkit_return_t
_set_custom_function(struct hashkit_function_st
*self
, hashkit_hash_fn function
, void *context
)
80 self
->function
= function
;
81 self
->context
= context
;
83 return HASHKIT_SUCCESS
;
86 return HASHKIT_FAILURE
;
89 hashkit_return_t
hashkit_set_custom_function(hashkit_st
*self
, hashkit_hash_fn function
, void *context
)
91 return _set_custom_function(&self
->base_hash
, function
, context
);
94 hashkit_return_t
hashkit_set_custom_distribution_function(hashkit_st
*self
, hashkit_hash_fn function
, void *context
)
96 return _set_custom_function(&self
->distribution_hash
, function
, context
);
99 static hashkit_hash_algorithm_t
get_function_type(const hashkit_hash_fn function
)
101 if (function
== hashkit_one_at_a_time
)
103 return HASHKIT_HASH_DEFAULT
;
105 else if (function
== hashkit_md5
)
107 return HASHKIT_HASH_MD5
;
109 else if (function
== hashkit_crc32
)
111 return HASHKIT_HASH_CRC
;
113 else if (function
== hashkit_fnv1_64
)
115 return HASHKIT_HASH_FNV1_64
;
117 else if (function
== hashkit_fnv1a_64
)
119 return HASHKIT_HASH_FNV1A_64
;
121 else if (function
== hashkit_fnv1_32
)
123 return HASHKIT_HASH_FNV1_32
;
125 else if (function
== hashkit_fnv1a_32
)
127 return HASHKIT_HASH_FNV1A_32
;
129 #ifdef HAVE_HSIEH_HASH
130 else if (function
== hashkit_hsieh
)
132 return HASHKIT_HASH_HSIEH
;
135 else if (function
== hashkit_murmur
)
137 return HASHKIT_HASH_MURMUR
;
139 else if (function
== hashkit_jenkins
)
141 return HASHKIT_HASH_JENKINS
;
144 return HASHKIT_HASH_CUSTOM
;
147 hashkit_hash_algorithm_t
hashkit_get_function(const hashkit_st
*self
)
149 return get_function_type(self
->base_hash
.function
);
152 hashkit_hash_algorithm_t
hashkit_get_distribution_function(const hashkit_st
*self
)
154 return get_function_type(self
->distribution_hash
.function
);
157 uint32_t libhashkit_generate_value(const char *key
, size_t key_length
, hashkit_hash_algorithm_t hash_algorithm
)
159 switch (hash_algorithm
)
161 case HASHKIT_HASH_DEFAULT
:
162 return libhashkit_one_at_a_time(key
, key_length
);
163 case HASHKIT_HASH_MD5
:
164 return libhashkit_md5(key
, key_length
);
165 case HASHKIT_HASH_CRC
:
166 return libhashkit_crc32(key
, key_length
);
167 case HASHKIT_HASH_FNV1_64
:
168 return libhashkit_fnv1_64(key
, key_length
);
169 case HASHKIT_HASH_FNV1A_64
:
170 return libhashkit_fnv1a_64(key
, key_length
);
171 case HASHKIT_HASH_FNV1_32
:
172 return libhashkit_fnv1_32(key
, key_length
);
173 case HASHKIT_HASH_FNV1A_32
:
174 return libhashkit_fnv1a_32(key
, key_length
);
175 case HASHKIT_HASH_HSIEH
:
176 #ifdef HAVE_HSIEH_HASH
177 return libhashkit_hsieh(key
, key_length
);
181 case HASHKIT_HASH_MURMUR
:
182 return libhashkit_murmur(key
, key_length
);
183 case HASHKIT_HASH_JENKINS
:
184 return libhashkit_jenkins(key
, key_length
);
185 case HASHKIT_HASH_CUSTOM
:
186 case HASHKIT_HASH_MAX
:
189 fprintf(stderr
, "hashkit_hash_t was extended but libhashkit_generate_value was not updated\n");