// djb2 string hash.  Exercises i32 arithmetic in a tight pointer-walk
// loop — hash << 5 + hash + c.  Hits the i32 shift inline path and the
// byte-load pattern in the same loop body.  Real-world: every hash
// table keyed by strings uses something like this.
unsigned long djb2Hash(const char *s) {
    unsigned long h = 5381;
    while (*s) {
        h = ((h << 5) + h) + (unsigned char)(*s++);
    }
    return h;
}
