From 6422c090f21c0b5ef035bb2ea784b1d9fb26f422 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 27 Mar 2024 12:54:37 +0000 Subject: [PATCH] Make hash procedures contextless where possible --- core/hash/crc.odin | 8 ++++---- core/hash/crc32.odin | 4 ++-- core/hash/hash.odin | 24 ++++++++++++------------ core/hash/mini.odin | 8 ++++---- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/core/hash/crc.odin b/core/hash/crc.odin index 9c0048a0f..cb3e36881 100644 --- a/core/hash/crc.odin +++ b/core/hash/crc.odin @@ -1,7 +1,7 @@ package hash @(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 #no_bounds_check for b in data { 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. */ @(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 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 */ @(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 @@ -70,7 +70,7 @@ crc64_iso_3306 :: proc(data: []byte, seed := u64(0)) -> u64 #no_bounds_check { 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) return ~result } diff --git a/core/hash/crc32.odin b/core/hash/crc32.odin index 761444676..5dde467a7 100644 --- a/core/hash/crc32.odin +++ b/core/hash/crc32.odin @@ -3,7 +3,7 @@ package hash import "base:intrinsics" @(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 buffer := raw_data(data) length := len(data) @@ -323,7 +323,7 @@ crc32_table := [8][256]u32{ /* @(optimization_mode="speed") -crc32 :: proc(data: []byte, seed := u32(0)) -> u32 { +crc32 :: proc "contextless" (data: []byte, seed := u32(0)) -> u32 { result := ~u32(seed); #no_bounds_check for b in data { result = result>>8 ~ _crc32_table[(result ~ u32(b)) & 0xff]; diff --git a/core/hash/hash.odin b/core/hash/hash.odin index ea99b630c..fb170bfe4 100644 --- a/core/hash/hash.odin +++ b/core/hash/hash.odin @@ -4,7 +4,7 @@ import "core:mem" import "base:intrinsics" @(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 @@ -47,7 +47,7 @@ adler32 :: proc(data: []byte, seed := u32(1)) -> u32 #no_bounds_check { } @(optimization_mode="speed") -djb2 :: proc(data: []byte, seed := u32(5381)) -> u32 { +djb2 :: proc "contextless" (data: []byte, seed := u32(5381)) -> u32 { hash: u32 = seed for b in data { hash = (hash << 5) + hash + u32(b) // hash * 33 + u32(b) @@ -55,7 +55,7 @@ djb2 :: proc(data: []byte, seed := u32(5381)) -> u32 { 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} 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 @(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 for b in data { 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 @(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 for b in data { h = (h * 0x100000001b3) ~ u64(b) @@ -95,7 +95,7 @@ fnv64_no_a :: proc(data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 { return h } @(optimization_mode="speed") -fnv32a :: proc(data: []byte, seed := u32(0x811c9dc5)) -> u32 { +fnv32a :: proc "contextless" (data: []byte, seed := u32(0x811c9dc5)) -> u32 { h: u32 = seed for b in data { h = (h ~ u32(b)) * 0x01000193 @@ -104,7 +104,7 @@ fnv32a :: proc(data: []byte, seed := u32(0x811c9dc5)) -> u32 { } @(optimization_mode="speed") -fnv64a :: proc(data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 { +fnv64a :: proc "contextless" (data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 { h: u64 = seed for b in data { h = (h ~ u64(b)) * 0x100000001b3 @@ -113,7 +113,7 @@ fnv64a :: proc(data: []byte, seed := u64(0xcbf29ce484222325)) -> u64 { } @(optimization_mode="speed") -jenkins :: proc(data: []byte, seed := u32(0)) -> u32 { +jenkins :: proc "contextless" (data: []byte, seed := u32(0)) -> u32 { hash: u32 = seed for b in data { hash += u32(b) @@ -127,7 +127,7 @@ jenkins :: proc(data: []byte, seed := u32(0)) -> u32 { } @(optimization_mode="speed") -murmur32 :: proc(data: []byte, seed := u32(0)) -> u32 { +murmur32 :: proc "contextless" (data: []byte, seed := u32(0)) -> u32 { c1_32: u32 : 0xcc9e2d51 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 @(optimization_mode="speed") -murmur64a :: proc(data: []byte, seed := u64(0x9747b28c)) -> u64 { +murmur64a :: proc "contextless" (data: []byte, seed := u64(0x9747b28c)) -> u64 { m :: 0xc6a4a7935bd1e995 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 @(optimization_mode="speed") -murmur64b :: proc(data: []byte, seed := u64(0x9747b28c)) -> u64 { +murmur64b :: proc "contextless" (data: []byte, seed := u64(0x9747b28c)) -> u64 { m :: 0x5bd1e995 r :: 24 @@ -287,7 +287,7 @@ murmur64b :: proc(data: []byte, seed := u64(0x9747b28c)) -> u64 { } @(optimization_mode="speed") -sdbm :: proc(data: []byte, seed := u32(0)) -> u32 { +sdbm :: proc "contextless" (data: []byte, seed := u32(0)) -> u32 { hash: u32 = seed for b in data { hash = u32(b) + (hash<<6) + (hash<<16) - hash diff --git a/core/hash/mini.odin b/core/hash/mini.odin index 98b1b4ba3..6b476f535 100644 --- a/core/hash/mini.odin +++ b/core/hash/mini.odin @@ -1,6 +1,6 @@ package hash -ginger_hash8 :: proc(x: u8) -> u8 { +ginger_hash8 :: proc "contextless" (x: u8) -> u8 { h := x * 251 h += ~(x << 3) 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) h := z 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) for b in data { h ~= ginger_hash8(b) } return h } -ginger16 :: proc(data: []byte) -> u16 { +ginger16 :: proc "contextless" (data: []byte) -> u16 { h := ginger_hash16(0) for b in data { h ~= ginger_hash16(u16(b))