aboutsummaryrefslogtreecommitdiff
path: root/core/hash
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-11-18 16:14:33 +0000
committergingerBill <bill@gingerbill.org>2021-11-18 16:14:33 +0000
commit12c1291805ce2aecc2f730c3db335e99181c7290 (patch)
tree5d71b4b6d36e3683485e5a48518e35f8d39f5ec4 /core/hash
parentae59f214ee6a47d3eb3832674928e7d66f9ac2e5 (diff)
Add optional seed parameters to all hashes
Diffstat (limited to 'core/hash')
-rw-r--r--core/hash/hash.odin42
1 files 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
}