redisのcrc 16は何の役に立ちますか?


redisのcrc 16は何の役に立ちますか?
crc 16アルゴリズムはredisの格納hashスロットに対する処理である
redisのhashスロットは16348個であり,理論的にはredisがクラスタ配置の化に最大でサポートされるのは16348個である.
redisのmulti-keyは確かに巧みで,{}という記号のkeyに対してhashが同じノードに保証される特殊な処理を行うことができ,redisマルチクラスタの下でkeyがアルゴリズムによってルーティングされた後に交差して集合できない操作を解決した.
hashスロット(16383)modの前にkeyに対してCRC 16のアルゴリズム検証が必要であり、この方法はクラスタ上のkeyセグメントの均一性を保証することができる
Redis Cluser       ,             0~16383     ,    :slot=CRC16(key)&16383。
            ,               。

/* --------------cluster.c---------------------------------------------------------------  * Key space handling  * -------------------------------------------------------------------------- */  /* 

We have 16384 hash slots. The hash slot of a given key is obtained  * as the least significant 14 bits of the crc16 of the key.  
*  * However if the key contains the {...} pattern, only the part between  * { and } is hashed. This may be useful in the future to force certain  * keys to be in the same node (assuming no resharding is in progress). */  
//   16384    ,   crc16       14     key    。  
//  ,     ‘{...}’     ,   "{“ “}”        。                       (             //                
unsigned int keyHashSlot(char *key, int keylen) {     int s, e; /* start-end indexes of { and } */      for (s = 0; s < keylen; s++)         if (key[s] == '{') break;      
/* No '{' ? Hash the whole key. This is the base case. */     //0x3FFF        16383     
if (s == keylen) return crc16(key,keylen) & 0x3FFF;      /* '{' found? Check if we have the corresponding '}'. */     for (e = s+1; e < keylen; e++)         if (key[e] == '}') break;      /* No '}' or nothing betweeen {} ? Hash the whole key. */     if (e == keylen || e == s+1) return crc16(key,keylen) & 0x3FFF;      /* If we are here there is both a { and a } on its right. Hash      * what is in the middle between { and }. */     return crc16(key+s+1,e-s-1) & 0x3FFF; } 


まず&取余は制限条件があります:除数は2のn次べき乗でなければならないredisの取余方式は正式にこの制限条件に基づいて&0 x 3 FFを使って取余操作を行うことができます