FixedHash

Revision as of 20:42, 16 April 2020 by imported>Leoetlino (→‎Format: alignment)

FixedHash is a custom Grezzo format for serializing hash tables that map string keys to arbitrary binary blobs.

FixedHash
File format
Endianness little
Version 1
This article is about the file format in general. For actual values, check the game RomFS.

Hash function

String keys are hashed using the following hash function:

u32 Hash(const char* key) {
  u32 hash = 0;
  while (*key) {
    hash ^= *key++ + (h >> 2) + (h << 5);
  }
  return hash;
}

Format

Offset Type Description
0x0 u8 Magic (must be 0x3D)
0x1 u8 Version (must be 1)
0x2 u16 Number of hash table buckets (N)
0x4 u16 Number of child FixedHash nodes
0x6 u16 Padding? [check]
0x8 u32[N + 1] Offsets to the first entry in each bucket (relative to the Entries section)
X = (0x8 + 4*(N+1) + 3) & -8 u64 Entries section size
X + 8 Entry[...] Entries
Y = align(X + entries section size, 8) u64 Entry offsets section size
Y + 8 u32[...] Entry offsets (relative to the Entries section)
Z = align(Y + entry offset section size, 8) u64 Data section size
Z + 8 any Data
A = align(Z + data section size, 4) u32 Name section size
A + 4 C strings Names