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
}
