mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 15:18:49 +00:00
Add optional seed parameters to all hashes
This commit is contained in:
+20
-22
@@ -47,8 +47,8 @@ adler32 :: proc(data: []byte, seed := u32(1)) -> u32 #no_bounds_check {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
djb2 :: proc(data: []byte) -> u32 {
|
djb2 :: proc(data: []byte, seed := u32(5381)) -> u32 {
|
||||||
hash: u32 = 5381
|
hash: u32 = seed
|
||||||
for b in data {
|
for b in data {
|
||||||
hash = (hash << 5) + hash + u32(b) // hash * 33 + u32(b)
|
hash = (hash << 5) + hash + u32(b) // hash * 33 + u32(b)
|
||||||
}
|
}
|
||||||
@@ -56,8 +56,8 @@ djb2 :: proc(data: []byte) -> u32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
fnv32 :: proc(data: []byte) -> u32 {
|
fnv32 :: proc(data: []byte, seed := u32(0x811c9dc5)) -> u32 {
|
||||||
h: u32 = 0x811c9dc5
|
h: u32 = seed
|
||||||
for b in data {
|
for b in data {
|
||||||
h = (h * 0x01000193) ~ u32(b)
|
h = (h * 0x01000193) ~ u32(b)
|
||||||
}
|
}
|
||||||
@@ -65,8 +65,8 @@ fnv32 :: proc(data: []byte) -> u32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
fnv64 :: proc(data: []byte) -> u64 {
|
fnv64 :: proc(data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 {
|
||||||
h: u64 = 0xcbf29ce484222325
|
h: u64 = seed
|
||||||
for b in data {
|
for b in data {
|
||||||
h = (h * 0x100000001b3) ~ u64(b)
|
h = (h * 0x100000001b3) ~ u64(b)
|
||||||
}
|
}
|
||||||
@@ -74,8 +74,8 @@ fnv64 :: proc(data: []byte) -> u64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
fnv32a :: proc(data: []byte) -> u32 {
|
fnv32a :: proc(data: []byte, seed := u32(0x811c9dc5)) -> u32 {
|
||||||
h: u32 = 0x811c9dc5
|
h: u32 = seed
|
||||||
for b in data {
|
for b in data {
|
||||||
h = (h ~ u32(b)) * 0x01000193
|
h = (h ~ u32(b)) * 0x01000193
|
||||||
}
|
}
|
||||||
@@ -83,8 +83,8 @@ fnv32a :: proc(data: []byte) -> u32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
fnv64a :: proc(data: []byte) -> u64 {
|
fnv64a :: proc(data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 {
|
||||||
h: u64 = 0xcbf29ce484222325
|
h: u64 = seed
|
||||||
for b in data {
|
for b in data {
|
||||||
h = (h ~ u64(b)) * 0x100000001b3
|
h = (h ~ u64(b)) * 0x100000001b3
|
||||||
}
|
}
|
||||||
@@ -92,8 +92,8 @@ fnv64a :: proc(data: []byte) -> u64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
jenkins :: proc(data: []byte) -> u32 {
|
jenkins :: proc(data: []byte, seed := u32(0)) -> u32 {
|
||||||
hash: u32 = 0
|
hash: u32 = seed
|
||||||
for b in data {
|
for b in data {
|
||||||
hash += u32(b)
|
hash += u32(b)
|
||||||
hash += hash << 10
|
hash += hash << 10
|
||||||
@@ -106,11 +106,11 @@ jenkins :: proc(data: []byte) -> u32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
murmur32 :: proc(data: []byte) -> u32 {
|
murmur32 :: proc(data: []byte, seed := u32(0)) -> u32 {
|
||||||
c1_32: u32 : 0xcc9e2d51
|
c1_32: u32 : 0xcc9e2d51
|
||||||
c2_32: u32 : 0x1b873593
|
c2_32: u32 : 0x1b873593
|
||||||
|
|
||||||
h1: u32 = 0
|
h1: u32 = seed
|
||||||
nblocks := len(data)/4
|
nblocks := len(data)/4
|
||||||
p := raw_data(data)
|
p := raw_data(data)
|
||||||
p1 := mem.ptr_offset(p, 4*nblocks)
|
p1 := mem.ptr_offset(p, 4*nblocks)
|
||||||
@@ -156,14 +156,12 @@ murmur32 :: proc(data: []byte) -> u32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
murmur64 :: proc(data: []byte) -> u64 {
|
murmur64 :: proc(data: []byte, seed := u64(0x9747b28c)) -> u64 {
|
||||||
SEED :: 0x9747b28c
|
|
||||||
|
|
||||||
when size_of(int) == 8 {
|
when size_of(int) == 8 {
|
||||||
m :: 0xc6a4a7935bd1e995
|
m :: 0xc6a4a7935bd1e995
|
||||||
r :: 47
|
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))
|
data64 := mem.slice_ptr(cast(^u64)raw_data(data), len(data)/size_of(u64))
|
||||||
|
|
||||||
for _, i in data64 {
|
for _, i in data64 {
|
||||||
@@ -198,8 +196,8 @@ murmur64 :: proc(data: []byte) -> u64 {
|
|||||||
m :: 0x5bd1e995
|
m :: 0x5bd1e995
|
||||||
r :: 24
|
r :: 24
|
||||||
|
|
||||||
h1 := u32(SEED) ~ u32(len(data))
|
h1 := u32(seed) ~ u32(len(data))
|
||||||
h2 := u32(SEED) >> 32
|
h2 := u32(seed) >> 32
|
||||||
data32 := mem.slice_ptr(cast(^u32)raw_data(data), len(data)/size_of(u32))
|
data32 := mem.slice_ptr(cast(^u32)raw_data(data), len(data)/size_of(u32))
|
||||||
len := len(data)
|
len := len(data)
|
||||||
i := 0
|
i := 0
|
||||||
@@ -262,8 +260,8 @@ murmur64 :: proc(data: []byte) -> u64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
sdbm :: proc(data: []byte) -> u32 {
|
sdbm :: proc(data: []byte, seed := u32(0)) -> u32 {
|
||||||
hash: u32 = 0
|
hash: u32 = seed
|
||||||
for b in data {
|
for b in data {
|
||||||
hash = u32(b) + (hash<<6) + (hash<<16) - hash
|
hash = u32(b) + (hash<<6) + (hash<<16) - hash
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user