2020-01-29 01:43:09 +03:00
|
|
|
module main
|
|
|
|
|
2020-04-26 09:32:05 +03:00
|
|
|
import hash.fnv1a
|
2020-07-18 15:27:57 +03:00
|
|
|
import hash as wyhash
|
2020-04-26 09:32:05 +03:00
|
|
|
import rand
|
2020-08-03 19:25:59 +03:00
|
|
|
import benchmark
|
2020-01-29 01:43:09 +03:00
|
|
|
|
|
|
|
fn main() {
|
2020-08-03 18:47:10 +03:00
|
|
|
rand.seed([u32(42), 0])
|
2020-01-29 01:43:09 +03:00
|
|
|
sample_size := 10000000
|
|
|
|
min_str_len := 20
|
|
|
|
max_str_len := 40
|
2022-11-15 16:53:13 +03:00
|
|
|
println('Generating ${sample_size} strings between ${min_str_len} - ${max_str_len} chars long...')
|
2020-08-03 19:25:59 +03:00
|
|
|
mut checksum := u64(0)
|
|
|
|
mut start_pos := 0
|
|
|
|
mut bgenerating := benchmark.start()
|
2022-04-15 15:35:35 +03:00
|
|
|
mut bytepile := []u8{}
|
2020-01-29 01:43:09 +03:00
|
|
|
for _ in 0 .. sample_size * max_str_len {
|
2022-04-15 14:58:56 +03:00
|
|
|
bytepile << u8(rand.int_in_range(40, 125) or { 40 })
|
2020-01-29 01:43:09 +03:00
|
|
|
}
|
2020-04-26 14:49:31 +03:00
|
|
|
mut str_lens := []int{}
|
2020-01-29 01:43:09 +03:00
|
|
|
for _ in 0 .. sample_size {
|
2022-02-23 13:36:14 +03:00
|
|
|
str_lens << rand.int_in_range(min_str_len, max_str_len) or { min_str_len }
|
2020-01-29 01:43:09 +03:00
|
|
|
}
|
2020-08-03 19:25:59 +03:00
|
|
|
bgenerating.measure('generating strings')
|
2020-01-29 01:43:09 +03:00
|
|
|
println('Hashing each of the generated strings...')
|
2020-08-03 19:25:59 +03:00
|
|
|
//
|
|
|
|
mut bhashing_1 := benchmark.start()
|
|
|
|
start_pos = 0
|
|
|
|
checksum = 0
|
2020-01-29 01:43:09 +03:00
|
|
|
for len in str_lens {
|
|
|
|
end_pos := start_pos + len
|
2022-04-15 14:58:56 +03:00
|
|
|
checksum ^= wyhash.wyhash_c(unsafe { &u8(bytepile.data) + start_pos }, u64(len),
|
2021-03-25 00:37:10 +03:00
|
|
|
1)
|
2020-01-29 01:43:09 +03:00
|
|
|
start_pos = end_pos
|
|
|
|
}
|
2020-08-22 13:29:15 +03:00
|
|
|
bhashing_1.measure('wyhash.wyhash_c | checksum: ${checksum:22}')
|
2020-08-03 19:25:59 +03:00
|
|
|
mut bhashing_2 := benchmark.start()
|
2020-01-29 01:43:09 +03:00
|
|
|
start_pos = 0
|
2020-08-03 19:25:59 +03:00
|
|
|
checksum = 0
|
2020-01-29 01:43:09 +03:00
|
|
|
for len in str_lens {
|
|
|
|
end_pos := start_pos + len
|
2020-08-22 13:29:15 +03:00
|
|
|
checksum ^= wyhash.sum64(bytepile[start_pos..end_pos], 1)
|
2020-01-29 01:43:09 +03:00
|
|
|
start_pos = end_pos
|
|
|
|
}
|
2020-08-22 13:29:15 +03:00
|
|
|
bhashing_2.measure('wyhash.sum64 | checksum: ${checksum:22}')
|
2020-08-03 19:25:59 +03:00
|
|
|
mut bhashing_3 := benchmark.start()
|
2020-01-29 01:43:09 +03:00
|
|
|
start_pos = 0
|
2020-08-03 19:25:59 +03:00
|
|
|
checksum = 0
|
2020-01-29 01:43:09 +03:00
|
|
|
for len in str_lens {
|
|
|
|
end_pos := start_pos + len
|
2020-08-22 13:29:15 +03:00
|
|
|
checksum ^= fnv1a.sum64(bytepile[start_pos..end_pos])
|
2020-01-29 01:43:09 +03:00
|
|
|
start_pos = end_pos
|
|
|
|
}
|
2020-08-22 13:29:15 +03:00
|
|
|
bhashing_3.measure('fnv1a.sum64 | checksum: ${checksum:22}')
|
2020-01-29 01:43:09 +03:00
|
|
|
}
|