package hash ginger_hash8 :: proc(x: u8) -> u8 { h := x * 251 h += ~(x << 3) h ~= (x >> 1) h += ~(x << 7) h ~= (x >> 6) h += (x << 2) return h } ginger_hash16 :: proc(x: u16) -> u16 { z := (x << 8) | (x >> 8) h := z h += ~(z << 5) h ~= (z >> 2) h += ~(z << 13) h ~= (z >> 10) h += ~(z << 4) h = (h << 10) | (h >> 10) return h } ginger8 :: proc(data: []byte) -> u8 { h := ginger_hash8(0) for b in data { h ~= ginger_hash8(b) } return h } ginger16 :: proc(data: []byte) -> u16 { h := ginger_hash16(0) for b in data { h ~= ginger_hash16(u16(b)) } return h }