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 재조정 후 일부 레코드가 발견되지 않을 수 있습니다. –
잔액이란 무엇입니까? 일반적으로 트리 균형을 조정할 때 레코드는 손실되지 않고 재정렬되지 않습니다. 나무를 균형 잡는 것은 실제로 투명합니다. –