mini.odin 615 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package hash
  2. ginger_hash8 :: proc(x: u8) -> u8 {
  3. h := x * 251;
  4. h += ~(x << 3);
  5. h ~= (x >> 1);
  6. h += ~(x << 7);
  7. h ~= (x >> 6);
  8. h += (x << 2);
  9. return h;
  10. }
  11. ginger_hash16 :: proc(x: u16) -> u16 {
  12. z := (x << 8) | (x >> 8);
  13. h := z;
  14. h += ~(z << 5);
  15. h ~= (z >> 2);
  16. h += ~(z << 13);
  17. h ~= (z >> 10);
  18. h += ~(z << 4);
  19. h = (h << 10) | (h >> 10);
  20. return h;
  21. }
  22. ginger8 :: proc(data: []byte) -> u8 {
  23. h := ginger_hash8(0);
  24. for b in data {
  25. h ~= ginger_hash8(b);
  26. }
  27. return h;
  28. }
  29. ginger16 :: proc(data: []byte) -> u16 {
  30. h := ginger_hash16(0);
  31. for b in data {
  32. h ~= ginger_hash16(u16(b));
  33. }
  34. return h;
  35. }