shortHash
Core hash: SHA-256, first 4 bytes encoded as 8 chars, lower-case. Always returns 8 chars and always starts with a letter (a–p).
Why the first char is forced to a letter
Bedrock's item-ID parser interpretsnamespace:<all-digits> as namespace:aux_value (the legacy 1.13-era item damage-value lookup) rather than as namespace:path. When the path component is all digits, the parser rejects the identifier with [Json][error]-Invalid aux value in item ID "...", and the Bedrock client never renders the attachable. Plain 8-hex-char output lands on all-digit values by chance for a small fraction of hashes, which we observed in production as scattered render misses. To avoid this without giving up entropy, the first nibble (4 bits) is mapped 0..f → a..p (16 letters). The remaining 7 nibbles stay as hex, preserving the full 32 bits of hash entropy. Result: always 8 chars, always starts with a letter, no all-digit outputs are possible.