Define a hash function in order to support Stint keys in hash tables (#102)
* Hash stint values as byte blobs; Add a basic test for using stint keys in a table
This commit is contained in:
parent
f0da0406f0
commit
9e49b00148
|
@ -12,7 +12,7 @@ import
|
||||||
./private/int_negabs,
|
./private/int_negabs,
|
||||||
./private/compiletime_helpers,
|
./private/compiletime_helpers,
|
||||||
./intops,
|
./intops,
|
||||||
typetraits, algorithm
|
typetraits, algorithm, hashes
|
||||||
|
|
||||||
template static_check_size(T: typedesc[SomeInteger], bits: static[int]) =
|
template static_check_size(T: typedesc[SomeInteger], bits: static[int]) =
|
||||||
# To avoid a costly runtime check, we refuse storing into StUint types smaller
|
# To avoid a costly runtime check, we refuse storing into StUint types smaller
|
||||||
|
@ -512,3 +512,10 @@ func toByteArrayBE*[bits: static[int]](n: StUint[bits]): array[bits div 8, byte]
|
||||||
let n_ptr {.restrict.} = cast[ptr array[N, byte]](n.unsafeAddr)
|
let n_ptr {.restrict.} = cast[ptr array[N, byte]](n.unsafeAddr)
|
||||||
for i in 0 ..< N:
|
for i in 0 ..< N:
|
||||||
result[N-1 - i] = n_ptr[i]
|
result[N-1 - i] = n_ptr[i]
|
||||||
|
|
||||||
|
template hash*(num: StUint|StInt): Hash =
|
||||||
|
# TODO:
|
||||||
|
# `hashData` is not particularly efficient.
|
||||||
|
# Explore better hashing solutions in nim-stew.
|
||||||
|
hashData(unsafeAddr num, sizeof num)
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#
|
#
|
||||||
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
||||||
|
|
||||||
import ../stint, unittest, strutils, math, test_helpers
|
import ../stint, unittest, strutils, math, test_helpers, tables
|
||||||
|
|
||||||
template nativeStuint(chk, nint: untyped, bits: int) =
|
template nativeStuint(chk, nint: untyped, bits: int) =
|
||||||
chk $(nint.stuint(bits)) == $(nint)
|
chk $(nint.stuint(bits)) == $(nint)
|
||||||
|
@ -1314,4 +1314,38 @@ proc main() =
|
||||||
check: eve.raw_sig.r.parse(Stuint[256], 16) == "84467545608142925331782333363288012579669270632210954476013542647119929595395".u256
|
check: eve.raw_sig.r.parse(Stuint[256], 16) == "84467545608142925331782333363288012579669270632210954476013542647119929595395".u256
|
||||||
check: eve.raw_sig.s.parse(Stuint[256], 16) == "43529886636775750164425297556346136250671451061152161143648812009114516499167".u256
|
check: eve.raw_sig.s.parse(Stuint[256], 16) == "43529886636775750164425297556346136250671451061152161143648812009114516499167".u256
|
||||||
|
|
||||||
|
test "Using stint values in a hash table":
|
||||||
|
block:
|
||||||
|
var t = initTable[UInt128, string]()
|
||||||
|
|
||||||
|
var numbers = @[
|
||||||
|
parse("0", UInt128),
|
||||||
|
parse("122342408432", UInt128),
|
||||||
|
parse("23853895230124238754328", UInt128),
|
||||||
|
parse("4539086493082871342142388475734534753453", UInt128),
|
||||||
|
]
|
||||||
|
|
||||||
|
for n in numbers:
|
||||||
|
t[n] = $n
|
||||||
|
|
||||||
|
for n in numbers:
|
||||||
|
check t[n] == $n
|
||||||
|
|
||||||
|
block:
|
||||||
|
var t = initTable[Int256, string]()
|
||||||
|
|
||||||
|
var numbers = @[
|
||||||
|
parse("0", Int256),
|
||||||
|
parse("-1", Int256),
|
||||||
|
parse("-12315123298", Int256),
|
||||||
|
parse("23853895230124238754328", Int256),
|
||||||
|
parse("-3429023852897428742874325245342129842", Int256),
|
||||||
|
]
|
||||||
|
|
||||||
|
for n in numbers:
|
||||||
|
t[n] = $n
|
||||||
|
|
||||||
|
for n in numbers:
|
||||||
|
check t[n] == $n
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
Loading…
Reference in New Issue