X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libhashkit%2Ffunction.cc;h=e6891a0fb026e6fb207364f9acb846b925f003f5;hb=f00605dce4a482c8b19ef17c0e79c31238498522;hp=7ac910071ef89792fa340ff4eff59a3dc4605c05;hpb=ae6bc7501efd5aeaaee92dabe2da0ec2d1625c5b;p=awesomized%2Flibmemcached diff --git a/libhashkit/function.cc b/libhashkit/function.cc index 7ac91007..e6891a0f 100644 --- a/libhashkit/function.cc +++ b/libhashkit/function.cc @@ -10,50 +10,81 @@ static hashkit_return_t _set_function(struct hashkit_st::hashkit_function_st *self, hashkit_hash_algorithm_t hash_algorithm) { + if (self == NULL) + { + return HASHKIT_INVALID_ARGUMENT; + } + switch (hash_algorithm) { - case HASHKIT_HASH_DEFAULT: - self->function= hashkit_one_at_a_time; - break; case HASHKIT_HASH_MD5: self->function= hashkit_md5; break; + case HASHKIT_HASH_CRC: self->function= hashkit_crc32; break; + case HASHKIT_HASH_FNV1_64: - self->function= hashkit_fnv1_64; - break; + if (libhashkit_has_algorithm(HASHKIT_HASH_FNV1_64)) + { + self->function= hashkit_fnv1_64; + break; + } + return HASHKIT_INVALID_ARGUMENT; + case HASHKIT_HASH_FNV1A_64: - self->function= hashkit_fnv1a_64; - break; + if (libhashkit_has_algorithm(HASHKIT_HASH_FNV1_64)) + { + self->function= hashkit_fnv1a_64; + break; + } + return HASHKIT_INVALID_ARGUMENT; + case HASHKIT_HASH_FNV1_32: self->function= hashkit_fnv1_32; break; + case HASHKIT_HASH_FNV1A_32: self->function= hashkit_fnv1a_32; break; + case HASHKIT_HASH_HSIEH: -#ifdef HAVE_HSIEH_HASH - self->function= hashkit_hsieh; - break; -#else - return HASHKIT_FAILURE; -#endif + if (libhashkit_has_algorithm(HASHKIT_HASH_HSIEH)) + { + self->function= hashkit_hsieh; + break; + } + return HASHKIT_INVALID_ARGUMENT; + + case HASHKIT_HASH_MURMUR3: + if (libhashkit_has_algorithm(HASHKIT_HASH_MURMUR3)) + { + self->function= hashkit_murmur3; + break; + } + return HASHKIT_INVALID_ARGUMENT; case HASHKIT_HASH_MURMUR: -#ifdef HAVE_MURMUR_HASH - self->function= hashkit_murmur; - break; -#else - return HASHKIT_FAILURE; -#endif + if (libhashkit_has_algorithm(HASHKIT_HASH_MURMUR)) + { + self->function= hashkit_murmur; + break; + } + return HASHKIT_INVALID_ARGUMENT; + case HASHKIT_HASH_JENKINS: self->function= hashkit_jenkins; break; + case HASHKIT_HASH_CUSTOM: return HASHKIT_INVALID_ARGUMENT; + + case HASHKIT_HASH_DEFAULT: + self->function= hashkit_one_at_a_time; + break; + case HASHKIT_HASH_MAX: - default: + self->function= hashkit_one_at_a_time; return HASHKIT_INVALID_HASH; } @@ -74,6 +105,11 @@ hashkit_return_t hashkit_set_distribution_function(hashkit_st *self, hashkit_has static hashkit_return_t _set_custom_function(struct hashkit_st::hashkit_function_st *self, hashkit_hash_fn function, void *context) { + if (self == NULL) + { + return HASHKIT_INVALID_ARGUMENT; + } + if (function) { self->function= function; @@ -87,11 +123,22 @@ static hashkit_return_t _set_custom_function(struct hashkit_st::hashkit_function hashkit_return_t hashkit_set_custom_function(hashkit_st *self, hashkit_hash_fn function, void *context) { + if (self == NULL) + { + return HASHKIT_INVALID_ARGUMENT; + } + + return _set_custom_function(&self->base_hash, function, context); } hashkit_return_t hashkit_set_custom_distribution_function(hashkit_st *self, hashkit_hash_fn function, void *context) { + if (self == NULL) + { + return HASHKIT_INVALID_ARGUMENT; + } + return _set_custom_function(&self->distribution_hash, function, context); } @@ -125,18 +172,14 @@ static hashkit_hash_algorithm_t get_function_type(const hashkit_hash_fn function { return HASHKIT_HASH_FNV1A_32; } -#ifdef HAVE_HSIEH_HASH else if (function == hashkit_hsieh) { return HASHKIT_HASH_HSIEH; } -#endif -#ifdef HAVE_MURMUR_HASH else if (function == hashkit_murmur) { return HASHKIT_HASH_MURMUR; } -#endif else if (function == hashkit_jenkins) { return HASHKIT_HASH_JENKINS; @@ -147,10 +190,20 @@ static hashkit_hash_algorithm_t get_function_type(const hashkit_hash_fn function hashkit_hash_algorithm_t hashkit_get_function(const hashkit_st *self) { + if (self == NULL) + { + return HASHKIT_HASH_DEFAULT; + } + return get_function_type(self->base_hash.function); } hashkit_hash_algorithm_t hashkit_get_distribution_function(const hashkit_st *self) { + if (self == NULL) + { + return HASHKIT_HASH_DEFAULT; + } + return get_function_type(self->distribution_hash.function); }