2011-10-18 13 views
0

それは基本的にハッシュに対する最初の検索は、それがleftrightだかどうかを決定するために、バイナリツリーです:ここでハッシュの計算方法ですこれは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; 
    ... 
} 

しかし、それはハッシュが計算方法ができないようです

これはバグですか?

答えて

2

キー自体の値でキーを順序付けしようとしていません。最初にハッシュで順序付けし、次にハッシュ衝突の場合はキー値で順序付けします。

だから、バグではありません。このタイプのテーブルがキー値で注文することを示す文書を引用できない限り、

+0

これはツリーの種類ではありません。これは単にキーの順序です。したがって、操作の性質はツリーの種類によって異なります。 –

+0

バランスを取っても安全ですか?IMOリバランシング後に一部のレコードが見つからないことがあります。 –

+0

残高はどういう意味ですか?通常、ツリーのバランスをとるとき、レコードは失われず、並べ替えられません。ツリーのバランスをとることは事実上透明です。 –

関連する問題