Это ошибка TokyoCabinet? - PullRequest
       18

Это ошибка TokyoCabinet?

0 голосов
/ 18 октября 2011

Это в основном двоичное дерево, которое сначала ищет по хешу, чтобы решить, является ли оно left или right:

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;
  ...
}

Но похоже, что вычисленный хэш не может обеспечить порядок ключей,

это ошибка?

1 Ответ

2 голосов
/ 18 октября 2011

Он не пытается упорядочить ключи по значению самих ключей.Он упорядочивает их сначала по хешу, а затем по значению ключа в случае коллизии хеша.

Так что нет, это не ошибка.Если только вы не можете ссылаться на документацию о том, что этот тип таблиц упорядочен по значению ключа.

...