From 12c1291805ce2aecc2f730c3db335e99181c7290 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 18 Nov 2021 16:14:33 +0000 Subject: [PATCH] Add optional seed parameters to all hashes --- core/hash/hash.odin | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/core/hash/hash.odin b/core/hash/hash.odin index 64c7ad5c4..f0d01bd25 100644 --- a/core/hash/hash.odin +++ b/core/hash/hash.odin @@ -47,8 +47,8 @@ adler32 :: proc(data: []byte, seed := u32(1)) -> u32 #no_bounds_check { } @(optimization_mode="speed") -djb2 :: proc(data: []byte) -> u32 { - hash: u32 = 5381 +djb2 :: proc(data: []byte, seed := u32(5381)) -> u32 { + hash: u32 = seed for b in data { hash = (hash << 5) + hash + u32(b) // hash * 33 + u32(b) } @@ -56,8 +56,8 @@ djb2 :: proc(data: []byte) -> u32 { } @(optimization_mode="speed") -fnv32 :: proc(data: []byte) -> u32 { - h: u32 = 0x811c9dc5 +fnv32 :: proc(data: []byte, seed := u32(0x811c9dc5)) -> u32 { + h: u32 = seed for b in data { h = (h * 0x01000193) ~ u32(b) } @@ -65,8 +65,8 @@ fnv32 :: proc(data: []byte) -> u32 { } @(optimization_mode="speed") -fnv64 :: proc(data: []byte) -> u64 { - h: u64 = 0xcbf29ce484222325 +fnv64 :: proc(data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 { + h: u64 = seed for b in data { h = (h * 0x100000001b3) ~ u64(b) } @@ -74,8 +74,8 @@ fnv64 :: proc(data: []byte) -> u64 { } @(optimization_mode="speed") -fnv32a :: proc(data: []byte) -> u32 { - h: u32 = 0x811c9dc5 +fnv32a :: proc(data: []byte, seed := u32(0x811c9dc5)) -> u32 { + h: u32 = seed for b in data { h = (h ~ u32(b)) * 0x01000193 } @@ -83,8 +83,8 @@ fnv32a :: proc(data: []byte) -> u32 { } @(optimization_mode="speed") -fnv64a :: proc(data: []byte) -> u64 { - h: u64 = 0xcbf29ce484222325 +fnv64a :: proc(data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 { + h: u64 = seed for b in data { h = (h ~ u64(b)) * 0x100000001b3 } @@ -92,8 +92,8 @@ fnv64a :: proc(data: []byte) -> u64 { } @(optimization_mode="speed") -jenkins :: proc(data: []byte) -> u32 { - hash: u32 = 0 +jenkins :: proc(data: []byte, seed := u32(0)) -> u32 { + hash: u32 = seed for b in data { hash += u32(b) hash += hash << 10 @@ -106,11 +106,11 @@ jenkins :: proc(data: []byte) -> u32 { } @(optimization_mode="speed") -murmur32 :: proc(data: []byte) -> u32 { +murmur32 :: proc(data: []byte, seed := u32(0)) -> u32 { c1_32: u32 : 0xcc9e2d51 c2_32: u32 : 0x1b873593 - h1: u32 = 0 + h1: u32 = seed nblocks := len(data)/4 p := raw_data(data) p1 := mem.ptr_offset(p, 4*nblocks) @@ -156,14 +156,12 @@ murmur32 :: proc(data: []byte) -> u32 { } @(optimization_mode="speed") -murmur64 :: proc(data: []byte) -> u64 { - SEED :: 0x9747b28c - +murmur64 :: proc(data: []byte, seed := u64(0x9747b28c)) -> u64 { when size_of(int) == 8 { m :: 0xc6a4a7935bd1e995 r :: 47 - h: u64 = SEED ~ (u64(len(data)) * m) + h: u64 = seed ~ (u64(len(data)) * m) data64 := mem.slice_ptr(cast(^u64)raw_data(data), len(data)/size_of(u64)) for _, i in data64 { @@ -198,8 +196,8 @@ murmur64 :: proc(data: []byte) -> u64 { m :: 0x5bd1e995 r :: 24 - h1 := u32(SEED) ~ u32(len(data)) - h2 := u32(SEED) >> 32 + h1 := u32(seed) ~ u32(len(data)) + h2 := u32(seed) >> 32 data32 := mem.slice_ptr(cast(^u32)raw_data(data), len(data)/size_of(u32)) len := len(data) i := 0 @@ -262,8 +260,8 @@ murmur64 :: proc(data: []byte) -> u64 { } @(optimization_mode="speed") -sdbm :: proc(data: []byte) -> u32 { - hash: u32 = 0 +sdbm :: proc(data: []byte, seed := u32(0)) -> u32 { + hash: u32 = seed for b in data { hash = u32(b) + (hash<<6) + (hash<<16) - hash }