浠庝笂涓鑺傜殑姒傝堪涓?鍙互鐪嬪埌record緇撴瀯浣撲腑鏈変袱涓垚鍛榣eft,right:
typedef struct { // type of structure for a record
uint64_t off; // offset of the record
uint32_t rsiz; // size of the whole record
uint8_t magic; // magic number
uint8_t hash; // second hash value
uint64_t left; // offset of the left child record
uint64_t right; // offset of the right child record
uint32_t ksiz; // size of the key
uint32_t vsiz; // size of the value
uint16_t psiz; // size of the padding
const char *kbuf; // pointer to the key
const char *vbuf; // pointer to the value
uint64_t boff; // offset of the body
char *bbuf; // buffer of the body
} TCHREC;
璇存槑,姣忎釜record鏄瓨鏀懼湪涓涓被浜屽弶鏍戠殑緇撴瀯涓殑.
瀹為檯涓?TC浼氶鍏堟牴鎹竴涓猺ecord鐨刱ey鍘葷畻鍑鴻key鎵鍦ㄧ殑bucket index浠ュ強hash index,浠g爜濡備笅:
/* Get the bucket index of a record.
`hdb' specifies the hash database object.
`kbuf' specifies the pointer to the region of the key.
`ksiz' specifies the size of the region of the key.
`hp' specifies the pointer to the variable into which the second hash value is assigned.
The return value is the bucket index. */
static uint64_t tchdbbidx(TCHDB *hdb, const char *kbuf, int ksiz, uint8_t *hp){
assert(hdb && kbuf && ksiz >= 0 && hp);
uint64_t idx = 19780211;
uint32_t hash = 751;
const char *rp = kbuf + ksiz;
while(ksiz--){
idx = idx * 37 + *(uint8_t *)kbuf++;
hash = (hash * 31) ^ *(uint8_t *)--rp;
}
*hp = hash;
return idx % hdb->bnum;
}
闇瑕佺壒鍒彁閱掔殑涓鐐規(guī)槸,涓婇潰鐨勭畻娉曚腑,鏍規(guī)嵁key綆楀嚭鎵鍦ㄧ殑bucket index,鏄粡榪囨āTCHDB->bnum涔嬪悗鐨勭粨鏋?涔熷氨鏄,榪欎釜鍊兼槸鏈夐檺鍒剁殑---鏈澶т笉鑳借秴榪嘥CHDB鍒濆鍖栨椂寰楀埌鐨刡ucket鏈澶ф暟閲?鑰岀畻鍑虹殑浜岀駭hash鍊?鎴戞槸娌℃湁鐪嬪嚭鏉ユ湁鏁板間笂鐨勯檺鍒剁殑,涓轟粈涔?鐪嬩簡鍚庨潰鐨勫唴瀹瑰氨鏄庣櫧浜?
鍥犳,鎵鏈夋牴鎹褰曠殑key綆楀嚭bucket index鐩稿悓鐨勮褰曞叏閮戒互浜屽弶鏍戠殑褰㈠紡緇勭粐璧鋒潵,鑰屾瘡涓猙ucket array鍏冪礌瀛樻斁鐨勬暣鍨嬪煎氨鏄bucket鏍戞牴鎵鍦ㄨ褰曠殑offset.
鍒版,鐩稿叧鐨勭粨鏋勪綋鑱旂郴閮芥竻妤氫簡,涓嬮潰鐨勬祦紼嬪浘緇欏嚭浜嗘煡鎵句竴涓猭ey鐨勮褰曟槸鍚﹀瓨鍦ㄧ殑嫻佺▼:

綆鍗曠殑瑙i噴涓涓?榪欎釜鏌ユ壘鐨勬祦紼嬪氨鏄鍏堟牴鎹煡鎵劇殑key綆楀嚭鎵鍦ㄧ殑bucket,鐒跺悗鍦ㄨ繖涓猙ucket鐨勪簩鍙夋爲涓寜鐓ф潯浠墮亶鍘嗙殑榪囩▼.
鍓嶉潰鎻愬埌榪?bucket array鏄暣涓mmap鏄犲皠鍒板叡浜唴瀛樹腑鍘葷殑.鎴戜滑鏉ュ仛涓涓及璁?鍋囪瀛樻斁bucket array鐨勫唴瀛樹嬌鐢ㄤ簡1G,鑰岀湡姝e瓨鏀緍ecord鐨勬枃浠墮暱搴︽湁16G,涔熷氨鏄?bucket array鐨勫厓绱犱笌璁板綍澶ф鏄?:16鐨勫叧緋?鍋囪鎵閫夌殑hash綆楁硶瓚沖鐨勫ソ,浠ヨ嚦浜庢瘡涓褰曠殑key鍙互杈冧負騫沖潎鐨勫垎甯冨湪涓嶅悓鐨刡ucket index涓?涔熷氨鏄瘡涓猙ucket array鐨勫厓绱犵粍鎴愮殑浜屽弶鏍戜笂騫沖潎鏈?6涓厓绱?閭d箞涔熷氨鏈澶氶渶瑕丱(4)嬈¤鍙栨枃浠禝/O(姣忔鍘昏鍙栬褰曠殑鏁版嵁閮芥槸涓嬈¤紓佺洏鎿嶄綔) + O(1)嬈″唴瀛樿鎿嶄綔(鍥犱負闇瑕佸湪bucket array涓緱鍒版爲鏍瑰厓绱犵殑offset).
浣嗘槸絳夌瓑,涓婇潰榪樻湁涓浜涚粏鑺傛病鏈変氦寰呮竻妤?
棣栧厛,涓婇潰鐨勪簩鍙夋爲涓嶆槸綾諱技AVL,綰㈤粦鏍戣繖鏍風殑騫寵 浜屽弶鏌ユ壘鏍?涔熷氨鏄,寰堝彲鑳藉湪鏋佺鐨勬儏鍐典笅婕斿彉鎴愪竴涓摼琛?--鏍戠殑涓杈規(guī)病鏈夊厓绱?鍙︿竴杈規(guī)湁鍏ㄩ儴鐨勫厓绱?
鍏舵,涓婇潰鐨勬祦紼嬪浘涓繕鏈変竴鐐瑰氨鏄瘡嬈℃瘮杈冮鍏堟瘮杈冪殑鏄痟ash鍊?榪欎釜鍊肩殑濂ョ灝卞湪浜庤В鍐充笂闈㈡彁鍒扮殑閭d釜闂.鏃㈢劧鍙槸涓涓櫘閫氱殑浜屽弶鏍?鏃犳硶淇濊瘉騫寵 ,閭d箞灝遍氳繃綆楀嚭榪欎釜浜岀駭鐨刪ash鍊兼潵淇濊瘉騫寵 ---褰撶劧,鍓嶆彁渚濈劧鏄墍閫夋嫨鐨刪ash綆楁硶瓚沖鐨勫ソ,鍙互淇濊瘉key騫沖潎鐨勫垎甯?
鍓嶉潰鎻愬埌榪?闈炲鉤琛$殑浜屽弶鏍戝彧浼氬湪鏋佺鐨勬儏鍐典笅鎵嶄細婕斿彉涓轟竴涓瀬绔笉騫寵 鐨勪簩鍙夋爲--閾捐〃,鑰岃濡侫VL,綰㈤粦鏍戜箣綾葷殑騫寵 浜屽弶鏍?綆楁硶緙栫爜閮界浉瀵瑰鏉?璋冭瘯璧鋒潵涔熼夯鐑?鍑洪敊浜嗚璺熻繘鏇撮夯鐑?鍙﹀榪樺埆蹇樹簡,榪欎簺騫寵 浜屽弶鏍戜箣鎵浠ヨ兘淇濇寔騫寵 ,鍦ㄥ垹闄?澧炲姞鍏冪礌鏃跺仛鐨勮鏍戦噸鏂板鉤琛$殑鎿嶄綔,姣斿鏃嬭漿絳?閮芥槸瑕佹秹鍙婂埌璇誨啓鏍戠粨鐐圭殑,鑰岃繖浜?鐩墠閮芥槸瀛樻斁鍦ㄧ鐩樹笂鐨?--涔熷氨鏄繖鏄浉瀵硅緝璐規(guī)椂鐨勬搷浣?鎵浠ラ棶棰樺湪浜?鏄笉鏄煎緱涓鴻繖涓涓瀬绔殑鎯呭喌鍘諱紭鍖?鍙﹀,寮曞叆浜岀駭hash灝辨槸涓轟簡閮ㄥ垎瑙e喅榪欎釜鏋佺涓嶅鉤琛¢棶棰?瀹冪殑鎬濊礬綆鍗曚篃瀹規(guī)槗瀹炵幇,浣嗘槸寮曞叆鐨勫彟澶栦竴涓棶棰樺氨鏄瘡嬈℃煡鎵炬椂鏍規(guī)嵁key鍘葷畻bucket index鐨勬椂鍊?榪樿鑰楄垂鏃墮棿鍘葷畻hash index浜?
騫寵 鐐?榪樻槸騫寵 鐐?鏃墮棿榪樻槸絀洪棿,榪欐槸涓涓棶棰?
鎵浠?緇忚繃瀵筎C鐨刪ash鏁版嵁搴撴煡鎵緆ey嫻佺▼鐨勫垎鏋?鏈澶х殑鎰熷彈鏄?瀹冩病鏈変嬌鐢ㄥ鏉傜殑綆楁硶涓庢暟鎹粨鏋?鑰屾槸閫氳繃涓浜涘閥濡欑殑浼樺寲濡備簩綰ash鐨勫紩鍏?杈懼埌浜嗙郴緇熸晥鐜囧拰緙栫爜璋冭瘯澶嶆潅搴︿箣闂翠竴涓緝濂界殑騫寵 .瀛︿細"騫寵 "鍚勭鍥犵礌,鏄仛欏圭洰鍋氫簨鎯?閮借鎺屾彙鐨勪竴涓妧鑳?鑰岃繖涓?鍙湁澶氱粡鍘嗗鎯蟲墠鑳芥參鎱㈢Н绱簡.
濂戒簡,綆鍗曠殑鍥為【鏁翠釜鏌ユ壘key鐨勫叧閿偣:
1) 鎵鏈夌殑record鏄互浜屽弶鏍戠殑褰㈠紡緇勭粐鍦ㄥ悓涓涓猙ucket涓婇潰鐨?
2) 榪欎釜浜屽弶鏍戜笉鏄鉤琛$殑浜屽弶鏍?br>3) 涓轟簡瑙e喅闂浜岄犳垚鐨勬瀬绔笉騫寵 闂,TC寮曞叆浜嗕簩綰ash,浠ヤ繚璇佽繖涓簩鍙夋爲灝藉彲鑳界殑騫寵 .
浠ヤ笂,灝辨槸TC瀵硅褰?bucket鐨勭粍緇囨儏鍐?浠ュ強鏁翠釜鏌ユ壘綆楁硶鐨勬祦紼?鍙互鐪嬪埌,綆楁硶,緇撴瀯浣撳畾涔夌瓑絳夐兘涓嶅鏉?浣嗘槸鐢變簬宸у鐨勬瀯鎬?鏃㈠彲浠ヤ嬌鐢ㄥ敖鍙兘綆鍗曠殑綆楁硶/鏁版嵁緇撴瀯,鍙堣兘瑙勯伩鍙兘鍑虹幇鐨勪竴浜涢殣鎮(zhèn)?鍚屾椂榪樿兘淇濊瘉鏌ユ壘鐨勯珮鏁堢巼.
鏌ユ壘鏄痥ey-value褰㈠紡瀛樺偍鐨勬牳蹇冩祦紼?鑳藉灝嗚繖涓祦紼嬩紭鍖?瀵規(guī)暣涓郴緇熺殑鎬ц兘涔熸湁寰堝ぇ鐨勫獎鍝?

]]>