ソースを参照

Add the mini ginger* hashes to package hash

gingerBill 4 年 前
コミット
79432be784
1 ファイル変更40 行追加0 行削除
  1. 40 0
      core/hash/mini.odin

+ 40 - 0
core/hash/mini.odin

@@ -0,0 +1,40 @@
+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;
+}