0
それは基本的にハッシュに対する最初の検索は、それがleft
かright
だかどうかを決定するために、バイナリツリーです:ここでハッシュの計算方法ですこれはTokyoCabinetのバグですか?
if(hash > rec.hash){
off = rec.left;
entoff = rec.off + (sizeof(uint8_t) + sizeof(uint8_t));
} else if(hash < rec.hash){
off = rec.right;
entoff = rec.off + (sizeof(uint8_t) + sizeof(uint8_t)) +
(hdb->ba64 ? sizeof(uint64_t) : sizeof(uint32_t));
} else {
if(!rec.kbuf && !tchdbreadrecbody(hdb, &rec)) return false;
int kcmp = tcreckeycmp(kbuf, ksiz, rec.kbuf, rec.ksiz);
if(kcmp > 0){
off = rec.left;
...
} else if(kcmp < 0){
off = rec.right;
...
:
static uint64_t tchdbbidx(TCHDB *hdb, const char *kbuf, int ksiz, uint8_t *hp){
...
uint32_t hash = 751;
const char *rp = kbuf + ksiz;
while(ksiz--){
...
hash = (hash * 31)^*(uint8_t *)--rp;
}
*hp = hash;
...
}
しかし、それはハッシュが計算方法ができないようです
これはバグですか?
これはツリーの種類ではありません。これは単にキーの順序です。したがって、操作の性質はツリーの種類によって異なります。 –
バランスを取っても安全ですか?IMOリバランシング後に一部のレコードが見つからないことがあります。 –
残高はどういう意味ですか?通常、ツリーのバランスをとるとき、レコードは失われず、並べ替えられません。ツリーのバランスをとることは事実上透明です。 –