mirror of
https://github.com/janet-lang/janet
synced 2024-12-28 01:10:26 +00:00
Change hash implementation for pointers.
This commit is contained in:
parent
1a9c14acde
commit
321a758ab9
@ -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))))
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user