static sparkey_returncode hashheader_version0()

in src/hashheader.c [36:72]


static sparkey_returncode hashheader_version0(sparkey_hashheader *header, FILE *fp) {
  RETHROW(fread_little_endian32(fp, &header->file_identifier));
  RETHROW(fread_little_endian32(fp, &header->hash_seed));
  RETHROW(fread_little_endian64(fp, &header->data_end));
  RETHROW(fread_little_endian64(fp, &header->max_key_len));
  RETHROW(fread_little_endian64(fp, &header->max_value_len));
  RETHROW(fread_little_endian64(fp, &header->num_puts));
  RETHROW(fread_little_endian64(fp, &header->garbage_size));
  RETHROW(fread_little_endian64(fp, &header->num_entries));

  RETHROW(fread_little_endian32(fp, &header->address_size));
  RETHROW(fread_little_endian32(fp, &header->hash_size));
  RETHROW(fread_little_endian64(fp, &header->hash_capacity));
  RETHROW(fread_little_endian64(fp, &header->max_displacement));
  RETHROW(fread_little_endian32(fp, &header->entry_block_bits));
  header->entry_block_bitmask = (1 << header->entry_block_bits) - 1;
  RETHROW(fread_little_endian64(fp, &header->hash_collisions));
  RETHROW(fread_little_endian64(fp, &header->total_displacement));
  header->header_size = HASH_HEADER_SIZE;

  header->hash_algorithm = sparkey_get_hash_algorithm(header->hash_size);
  if (header->hash_algorithm.hash == NULL) {
    return SPARKEY_HASH_HEADER_CORRUPT;
  }
  // Some basic consistency checks
  if (header->num_entries > header->num_puts) {
    return SPARKEY_HASH_HEADER_CORRUPT;
  }
  if (header->max_displacement > header->num_entries) {
    return SPARKEY_HASH_HEADER_CORRUPT;
  }
  if (header->hash_collisions > header->num_entries) {
    return SPARKEY_HASH_HEADER_CORRUPT;
  }

  return SPARKEY_SUCCESS;
}