1
0
mirror of https://github.com/janet-lang/janet synced 2024-06-28 08:03:16 +00:00

Change hash implementation for pointers.

This commit is contained in:
Calvin Rose 2020-09-06 11:41:45 -05:00
parent 1a9c14acde
commit 321a758ab9
2 changed files with 4 additions and 6 deletions

View File

@ -1877,7 +1877,7 @@
(case tx (case tx
:tuple (or (not= (length x) (length y)) (some identity (map deep-not= x y))) :tuple (or (not= (length x) (length y)) (some identity (map deep-not= x y)))
:array (or (not= (length x) (length y)) (some identity (map deep-not= x y))) :array (or (not= (length x) (length y)) (some identity (map deep-not= x y)))
:struct (deep-not= (pairs x) (pairs y)) :struct (deep-not= (kvs x) (kvs y))
:table (deep-not= (table/to-struct x) (table/to-struct y)) :table (deep-not= (table/to-struct x) (table/to-struct y))
:buffer (not= (string x) (string y)) :buffer (not= (string x) (string y))
(not= x y)))) (not= x y))))

View File

@ -271,14 +271,12 @@ int32_t janet_hash(Janet x) {
} }
/* fallthrough */ /* fallthrough */
default: default:
/* TODO - test performance with different hash functions */
if (sizeof(double) == sizeof(void *)) { if (sizeof(double) == sizeof(void *)) {
/* Assuming 8 byte pointer */ /* Assuming 8 byte pointer */
uint64_t i = janet_u64(x); uint64_t i = janet_u64(x);
hash = (int32_t)(i & 0xFFFFFFFF); uint32_t lo = (uint32_t) (i & 0xFFFFFFFF);
/* Get a bit more entropy by shifting the low bits out */ uint32_t hi = (uint32_t) (i >> 32);
hash >>= 3; hash = (int32_t) (hi ^ (lo >> 3));
hash ^= (int32_t)(i >> 32);
} else { } else {
/* Assuming 4 byte pointer (or smaller) */ /* Assuming 4 byte pointer (or smaller) */
hash = (int32_t)((char *)janet_unwrap_pointer(x) - (char *)0); hash = (int32_t)((char *)janet_unwrap_pointer(x) - (char *)0);