hash Code
Standard polynomial-accumulation hash over the same fields equals() compares. The multiplier 31 is the Java/Kotlin convention: it's an odd prime (good bit distribution, no bit loss as values accumulate) and the JVM optimizes 31 * x to (x << 5) - x. Folds each field into a different bit range, so similar destinations (e.g. sequential hdIndex) don't cluster in adjacent HashMap buckets.