mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 07:08:48 +00:00
Make hash procedures contextless where possible
This commit is contained in:
+4
-4
@@ -1,7 +1,7 @@
|
|||||||
package hash
|
package hash
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
crc64_ecma_182 :: proc(data: []byte, seed := u64(0)) -> (result: u64) #no_bounds_check {
|
crc64_ecma_182 :: proc "contextless" (data: []byte, seed := u64(0)) -> (result: u64) #no_bounds_check {
|
||||||
result = seed
|
result = seed
|
||||||
#no_bounds_check for b in data {
|
#no_bounds_check for b in data {
|
||||||
result = result<<8 ~ _crc64_table_ecma_182[((result>>56) ~ u64(b)) & 0xff]
|
result = result<<8 ~ _crc64_table_ecma_182[((result>>56) ~ u64(b)) & 0xff]
|
||||||
@@ -15,7 +15,7 @@ crc64_ecma_182 :: proc(data: []byte, seed := u64(0)) -> (result: u64) #no_bounds
|
|||||||
Based on Mark Adler's v1.4 implementation in C under the ZLIB license.
|
Based on Mark Adler's v1.4 implementation in C under the ZLIB license.
|
||||||
*/
|
*/
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
crc64_xz :: proc(data: []byte, seed := u64(0)) -> u64 #no_bounds_check {
|
crc64_xz :: proc "contextless" (data: []byte, seed := u64(0)) -> u64 #no_bounds_check {
|
||||||
data := data
|
data := data
|
||||||
result := ~u64le(seed)
|
result := ~u64le(seed)
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ crc64_xz :: proc(data: []byte, seed := u64(0)) -> u64 #no_bounds_check {
|
|||||||
Generator polynomial: x^64 + x^4 + x^3 + x + 1
|
Generator polynomial: x^64 + x^4 + x^3 + x + 1
|
||||||
*/
|
*/
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
crc64_iso_3306 :: proc(data: []byte, seed := u64(0)) -> u64 #no_bounds_check {
|
crc64_iso_3306 :: proc "contextless" (data: []byte, seed := u64(0)) -> u64 #no_bounds_check {
|
||||||
|
|
||||||
result := seed
|
result := seed
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ crc64_iso_3306 :: proc(data: []byte, seed := u64(0)) -> u64 #no_bounds_check {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
crc64_iso_3306_inverse :: proc(data: []byte, seed := u64(0)) -> u64 {
|
crc64_iso_3306_inverse :: proc "contextless" (data: []byte, seed := u64(0)) -> u64 {
|
||||||
result := #force_inline crc64_iso_3306(data, ~seed)
|
result := #force_inline crc64_iso_3306(data, ~seed)
|
||||||
return ~result
|
return ~result
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package hash
|
|||||||
import "base:intrinsics"
|
import "base:intrinsics"
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
crc32 :: proc(data: []byte, seed := u32(0)) -> u32 #no_bounds_check {
|
crc32 :: proc "contextless" (data: []byte, seed := u32(0)) -> u32 #no_bounds_check {
|
||||||
crc := ~seed
|
crc := ~seed
|
||||||
buffer := raw_data(data)
|
buffer := raw_data(data)
|
||||||
length := len(data)
|
length := len(data)
|
||||||
@@ -323,7 +323,7 @@ crc32_table := [8][256]u32{
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
crc32 :: proc(data: []byte, seed := u32(0)) -> u32 {
|
crc32 :: proc "contextless" (data: []byte, seed := u32(0)) -> u32 {
|
||||||
result := ~u32(seed);
|
result := ~u32(seed);
|
||||||
#no_bounds_check for b in data {
|
#no_bounds_check for b in data {
|
||||||
result = result>>8 ~ _crc32_table[(result ~ u32(b)) & 0xff];
|
result = result>>8 ~ _crc32_table[(result ~ u32(b)) & 0xff];
|
||||||
|
|||||||
+12
-12
@@ -4,7 +4,7 @@ import "core:mem"
|
|||||||
import "base:intrinsics"
|
import "base:intrinsics"
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
adler32 :: proc(data: []byte, seed := u32(1)) -> u32 #no_bounds_check {
|
adler32 :: proc "contextless" (data: []byte, seed := u32(1)) -> u32 #no_bounds_check {
|
||||||
|
|
||||||
ADLER_CONST :: 65521
|
ADLER_CONST :: 65521
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ adler32 :: proc(data: []byte, seed := u32(1)) -> u32 #no_bounds_check {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
djb2 :: proc(data: []byte, seed := u32(5381)) -> u32 {
|
djb2 :: proc "contextless" (data: []byte, seed := u32(5381)) -> u32 {
|
||||||
hash: u32 = seed
|
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)
|
||||||
@@ -55,7 +55,7 @@ djb2 :: proc(data: []byte, seed := u32(5381)) -> u32 {
|
|||||||
return hash
|
return hash
|
||||||
}
|
}
|
||||||
|
|
||||||
djbx33a :: proc(data: []byte, seed := u32(5381)) -> (result: [16]byte) #no_bounds_check {
|
djbx33a :: proc "contextless" (data: []byte, seed := u32(5381)) -> (result: [16]byte) #no_bounds_check {
|
||||||
state := [4]u32{seed, seed, seed, seed}
|
state := [4]u32{seed, seed, seed, seed}
|
||||||
|
|
||||||
s: u32 = 0
|
s: u32 = 0
|
||||||
@@ -74,7 +74,7 @@ djbx33a :: proc(data: []byte, seed := u32(5381)) -> (result: [16]byte) #no_bound
|
|||||||
|
|
||||||
// If you have a choice, prefer fnv32a
|
// If you have a choice, prefer fnv32a
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
fnv32_no_a :: proc(data: []byte, seed := u32(0x811c9dc5)) -> u32 {
|
fnv32_no_a :: proc "contextless" (data: []byte, seed := u32(0x811c9dc5)) -> u32 {
|
||||||
h: u32 = seed
|
h: u32 = seed
|
||||||
for b in data {
|
for b in data {
|
||||||
h = (h * 0x01000193) ~ u32(b)
|
h = (h * 0x01000193) ~ u32(b)
|
||||||
@@ -87,7 +87,7 @@ fnv64 :: fnv64_no_a // NOTE(bill): Not a fan of these aliases but seems necessar
|
|||||||
|
|
||||||
// If you have a choice, prefer fnv64a
|
// If you have a choice, prefer fnv64a
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
fnv64_no_a :: proc(data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 {
|
fnv64_no_a :: proc "contextless" (data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 {
|
||||||
h: u64 = seed
|
h: u64 = seed
|
||||||
for b in data {
|
for b in data {
|
||||||
h = (h * 0x100000001b3) ~ u64(b)
|
h = (h * 0x100000001b3) ~ u64(b)
|
||||||
@@ -95,7 +95,7 @@ fnv64_no_a :: proc(data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 {
|
|||||||
return h
|
return h
|
||||||
}
|
}
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
fnv32a :: proc(data: []byte, seed := u32(0x811c9dc5)) -> u32 {
|
fnv32a :: proc "contextless" (data: []byte, seed := u32(0x811c9dc5)) -> u32 {
|
||||||
h: u32 = seed
|
h: u32 = seed
|
||||||
for b in data {
|
for b in data {
|
||||||
h = (h ~ u32(b)) * 0x01000193
|
h = (h ~ u32(b)) * 0x01000193
|
||||||
@@ -104,7 +104,7 @@ fnv32a :: proc(data: []byte, seed := u32(0x811c9dc5)) -> u32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
fnv64a :: proc(data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 {
|
fnv64a :: proc "contextless" (data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 {
|
||||||
h: u64 = seed
|
h: u64 = seed
|
||||||
for b in data {
|
for b in data {
|
||||||
h = (h ~ u64(b)) * 0x100000001b3
|
h = (h ~ u64(b)) * 0x100000001b3
|
||||||
@@ -113,7 +113,7 @@ fnv64a :: proc(data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
jenkins :: proc(data: []byte, seed := u32(0)) -> u32 {
|
jenkins :: proc "contextless" (data: []byte, seed := u32(0)) -> u32 {
|
||||||
hash: u32 = seed
|
hash: u32 = seed
|
||||||
for b in data {
|
for b in data {
|
||||||
hash += u32(b)
|
hash += u32(b)
|
||||||
@@ -127,7 +127,7 @@ jenkins :: proc(data: []byte, seed := u32(0)) -> u32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
murmur32 :: proc(data: []byte, seed := u32(0)) -> u32 {
|
murmur32 :: proc "contextless" (data: []byte, seed := u32(0)) -> u32 {
|
||||||
c1_32: u32 : 0xcc9e2d51
|
c1_32: u32 : 0xcc9e2d51
|
||||||
c2_32: u32 : 0x1b873593
|
c2_32: u32 : 0x1b873593
|
||||||
|
|
||||||
@@ -178,7 +178,7 @@ murmur32 :: proc(data: []byte, seed := u32(0)) -> u32 {
|
|||||||
|
|
||||||
// See https://github.com/aappleby/smhasher/blob/master/src/MurmurHash2.cpp#L96
|
// See https://github.com/aappleby/smhasher/blob/master/src/MurmurHash2.cpp#L96
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
murmur64a :: proc(data: []byte, seed := u64(0x9747b28c)) -> u64 {
|
murmur64a :: proc "contextless" (data: []byte, seed := u64(0x9747b28c)) -> u64 {
|
||||||
m :: 0xc6a4a7935bd1e995
|
m :: 0xc6a4a7935bd1e995
|
||||||
r :: 47
|
r :: 47
|
||||||
|
|
||||||
@@ -219,7 +219,7 @@ murmur64a :: proc(data: []byte, seed := u64(0x9747b28c)) -> u64 {
|
|||||||
|
|
||||||
// See https://github.com/aappleby/smhasher/blob/master/src/MurmurHash2.cpp#L140
|
// See https://github.com/aappleby/smhasher/blob/master/src/MurmurHash2.cpp#L140
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
murmur64b :: proc(data: []byte, seed := u64(0x9747b28c)) -> u64 {
|
murmur64b :: proc "contextless" (data: []byte, seed := u64(0x9747b28c)) -> u64 {
|
||||||
m :: 0x5bd1e995
|
m :: 0x5bd1e995
|
||||||
r :: 24
|
r :: 24
|
||||||
|
|
||||||
@@ -287,7 +287,7 @@ murmur64b :: proc(data: []byte, seed := u64(0x9747b28c)) -> u64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(optimization_mode="speed")
|
@(optimization_mode="speed")
|
||||||
sdbm :: proc(data: []byte, seed := u32(0)) -> u32 {
|
sdbm :: proc "contextless" (data: []byte, seed := u32(0)) -> u32 {
|
||||||
hash: u32 = seed
|
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
|
||||||
|
|||||||
+4
-4
@@ -1,6 +1,6 @@
|
|||||||
package hash
|
package hash
|
||||||
|
|
||||||
ginger_hash8 :: proc(x: u8) -> u8 {
|
ginger_hash8 :: proc "contextless" (x: u8) -> u8 {
|
||||||
h := x * 251
|
h := x * 251
|
||||||
h += ~(x << 3)
|
h += ~(x << 3)
|
||||||
h ~= (x >> 1)
|
h ~= (x >> 1)
|
||||||
@@ -11,7 +11,7 @@ ginger_hash8 :: proc(x: u8) -> u8 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ginger_hash16 :: proc(x: u16) -> u16 {
|
ginger_hash16 :: proc "contextless" (x: u16) -> u16 {
|
||||||
z := (x << 8) | (x >> 8)
|
z := (x << 8) | (x >> 8)
|
||||||
h := z
|
h := z
|
||||||
h += ~(z << 5)
|
h += ~(z << 5)
|
||||||
@@ -24,14 +24,14 @@ ginger_hash16 :: proc(x: u16) -> u16 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ginger8 :: proc(data: []byte) -> u8 {
|
ginger8 :: proc "contextless" (data: []byte) -> u8 {
|
||||||
h := ginger_hash8(0)
|
h := ginger_hash8(0)
|
||||||
for b in data {
|
for b in data {
|
||||||
h ~= ginger_hash8(b)
|
h ~= ginger_hash8(b)
|
||||||
}
|
}
|
||||||
return h
|
return h
|
||||||
}
|
}
|
||||||
ginger16 :: proc(data: []byte) -> u16 {
|
ginger16 :: proc "contextless" (data: []byte) -> u16 {
|
||||||
h := ginger_hash16(0)
|
h := ginger_hash16(0)
|
||||||
for b in data {
|
for b in data {
|
||||||
h ~= ginger_hash16(u16(b))
|
h ~= ginger_hash16(u16(b))
|
||||||
|
|||||||
Reference in New Issue
Block a user