44// modified from libketama
55//
66
7- #include "include/ consistentHash.h"
7+ #include "consistentHash.h"
88
99#include <inttypes.h>
1010#include <stdbool.h>
1111
12- #include "include/ md5.h"
12+ #include "md5.h"
1313
1414#ifdef __cplusplus
1515extern "C" {
1616#endif
1717
18- int ch_ring_compare (const void * a , const void * b ) {
19- vnode_t * node_a = (vnode_t * )a ;
20- vnode_t * node_b = (vnode_t * )b ;
21- return (node_a -> point < node_b -> point )
22- ? -1
23- : ((node_a -> point > node_b -> point ) ? 1 : 0 );
18+ int ch_ring_compare (const void * node_a_ptr , const void * node_b_ptr ) {
19+ vnode_t * node_a = (vnode_t * )node_a_ptr ;
20+ vnode_t * node_b = (vnode_t * )node_b_ptr ;
21+ if (node_a -> point < node_b -> point ) {
22+ return -1 ;
23+ }
24+ if (node_a -> point > node_b -> point ) {
25+ return 1 ;
26+ }
27+ return 0 ;
2428}
2529
2630void md5_digest (const char * const inString , unsigned char md5pword [16 ]) {
@@ -38,7 +42,7 @@ unsigned int ketama_hash(const char *const inString) {
3842 (digest [1 ] << 8 ) | digest [0 ]);
3943}
4044
41- ring_t * ch_ring_create_ring (int n_server , double * weight ) {
45+ ring_t * ch_ring_create_ring (int n_server , const double * weight ) {
4246 vnode_t * vnodes =
4347 (vnode_t * )malloc (sizeof (vnode_t ) * n_server * N_VNODE_PER_SERVER );
4448
@@ -47,35 +51,38 @@ ring_t *ch_ring_create_ring(int n_server, double *weight) {
4751 ring -> n_point = n_server * N_VNODE_PER_SERVER ;
4852 ring -> vnodes = vnodes ;
4953
50- int i ;
51- unsigned int k , cnt = 0 ;
54+ int server_idx ;
55+ unsigned int key_idx ;
56+ unsigned int cnt = 0 ;
5257
53- for (i = 0 ; i < n_server ; i ++ ) {
58+ for (server_idx = 0 ; server_idx < n_server ; server_idx ++ ) {
5459 // default all servers have the same weight
55- unsigned int ks = N_VNODE_PER_SERVER / 4 ;
60+ unsigned int keys_per_server = N_VNODE_PER_SERVER / 4 ;
5661 if (weight != NULL )
57- ks = (unsigned int )floorf (weight [i ] * (float )n_server *
58- (N_VNODE_PER_SERVER / 4 ));
62+ keys_per_server =
63+ (unsigned int )floorf ((float )(weight [server_idx ] * (double )n_server *
64+ (N_VNODE_PER_SERVER / 4 )));
5965
60- for (k = 0 ; k < ks ; k ++ ) {
66+ for (key_idx = 0 ; key_idx < keys_per_server ; key_idx ++ ) {
6167 /* 40 hashes, 4 numbers per hash = 160 points per server */
62- char ss [30 ];
68+ char string_buf [30 ];
6369 unsigned char digest [16 ];
6470
65- sprintf (ss , "%u-%u" , i , k );
66- md5_digest (ss , digest );
71+ sprintf (string_buf , "%u-%u" , server_idx , key_idx );
72+ md5_digest (string_buf , digest );
6773
6874 /* Use successive 4-bytes from hash as numbers for the points on the
6975 * circle: */
70- int h ;
71- for (h = 0 ; h < 4 ; h ++ ) {
76+ int hash_idx ;
77+ for (hash_idx = 0 ; hash_idx < 4 ; hash_idx ++ ) {
7278 // printf("%d i %d k %d h %d %d %d\n", cnt, i, k, h, ring->n_server,
7379 // ring->n_point);
74- vnodes [cnt ].point = (digest [3 + h * 4 ] << 24 ) |
75- (digest [2 + h * 4 ] << 16 ) |
76- (digest [1 + h * 4 ] << 8 ) | digest [h * 4 ];
80+ vnodes [cnt ].point = (digest [3 + hash_idx * 4 ] << 24 ) |
81+ (digest [2 + hash_idx * 4 ] << 16 ) |
82+ (digest [1 + hash_idx * 4 ] << 8 ) |
83+ digest [hash_idx * 4 ];
7784
78- vnodes [cnt ].server_id = i ;
85+ vnodes [cnt ].server_id = server_idx ;
7986 cnt ++ ;
8087 }
8188 }
@@ -136,10 +143,9 @@ int ch_ring_get_server(const char *const key, const ring_t *const ring) {
136143 return (ring -> vnodes + ch_ring_get_vnode_idx (key , ring ))-> server_id ;
137144}
138145
139- int ch_ring_get_server_from_uint64 (uint64_t obj_id ,
140- const ring_t * const ring ) {
141- char key [8 ];
142- memcpy (key , (char * ) & obj_id , 8 );
146+ int ch_ring_get_server_from_uint64 (uint64_t obj_id , const ring_t * const ring ) {
147+ char key [8 ];
148+ memcpy (key , (char * )& obj_id , 8 );
143149 key [7 ] = 0 ;
144150 return (ring -> vnodes + ch_ring_get_vnode_idx (key , ring ))-> server_id ;
145151}
0 commit comments