2011-10-18 5 views
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; 
    ... 
} 

그러나 해시 할 수 없습니다 계산 방식 보인다

키 순서가 맞는지 확인하십시오.

답변

2

키 자체의 값으로 키를 정렬하려고하지 않습니다. 먼저 해쉬에 의해 순서화되고, 그 다음에 해시 충돌의 경우 키 값에 의해 순서가 정해집니다.

아니요, 아니요, 버그가 아닙니다. 이 유형의 테이블은 키 값별로 주문한다는 문서를 인용 할 수 없다면 말입니다.

+0

이것은 나무 유형이 아닙니다. 이것은 단지 키를 정렬하는 것입니다. 따라서 작업의 성격은 트리의 유형에 따라 다릅니다. –

+0

균형을 유지하는 것이 안전합니까? IMO 재조정 후 일부 레코드가 발견되지 않을 수 있습니다. –

+0

잔액이란 무엇입니까? 일반적으로 트리 균형을 조정할 때 레코드는 손실되지 않고 재정렬되지 않습니다. 나무를 균형 잡는 것은 실제로 투명합니다. –