Alternate to https://github.com/nim-lang/Nim/pull/15915 (#15937)
* Alternate PR to https://github.com/nim-lang/Nim/pull/15915 to resolve the problem mentioned there (`hash() == 0`) as well as to close https://github.com/nim-lang/Nim/issues/15624 * Address https://github.com/nim-lang/Nim/pull/15937#discussion_r522759669 { though this was only a move from 2 copies to 3 copies. ;-) }
This commit is contained in:
parent
797cb2e67b
commit
a9bd4c4e80
1 changed files with 7 additions and 2 deletions
|
|
@ -113,8 +113,12 @@ proc hashWangYi1*(x: int64|uint64|Hash): Hash {.inline.} =
|
||||||
const P0 = 0xa0761d6478bd642f'u64
|
const P0 = 0xa0761d6478bd642f'u64
|
||||||
const P1 = 0xe7037ed1a0b428db'u64
|
const P1 = 0xe7037ed1a0b428db'u64
|
||||||
const P58 = 0xeb44accab455d165'u64 xor 8'u64
|
const P58 = 0xeb44accab455d165'u64 xor 8'u64
|
||||||
|
template h(x): untyped = hiXorLo(hiXorLo(P0, uint64(x) xor P1), P58)
|
||||||
when nimvm:
|
when nimvm:
|
||||||
cast[Hash](hiXorLo(hiXorLo(P0, uint64(x) xor P1), P58))
|
when defined(js): # Nim int64<->JS Number & VM match => JS gets 32-bit hash
|
||||||
|
result = cast[Hash](h(x)) and cast[Hash](0xFFFFFFFF)
|
||||||
|
else:
|
||||||
|
result = cast[Hash](h(x))
|
||||||
else:
|
else:
|
||||||
when defined(js):
|
when defined(js):
|
||||||
asm """
|
asm """
|
||||||
|
|
@ -132,8 +136,9 @@ proc hashWangYi1*(x: int64|uint64|Hash): Hash {.inline.} =
|
||||||
var res = hi_xor_lo_js(hi_xor_lo_js(P0, BigInt(`x`) ^ P1), P58);
|
var res = hi_xor_lo_js(hi_xor_lo_js(P0, BigInt(`x`) ^ P1), P58);
|
||||||
`result` = Number(res & ((BigInt(1) << BigInt(53)) - BigInt(1)));
|
`result` = Number(res & ((BigInt(1) << BigInt(53)) - BigInt(1)));
|
||||||
}"""
|
}"""
|
||||||
|
result = result and cast[Hash](0xFFFFFFFF)
|
||||||
else:
|
else:
|
||||||
cast[Hash](hiXorLo(hiXorLo(P0, uint64(x) xor P1), P58))
|
result = cast[Hash](h(x))
|
||||||
|
|
||||||
proc hashData*(data: pointer, size: int): Hash =
|
proc hashData*(data: pointer, size: int): Hash =
|
||||||
## Hashes an array of bytes of size `size`.
|
## Hashes an array of bytes of size `size`.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue