57 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			V
		
	
	
module main
 | 
						|
 | 
						|
import hash.fnv1a
 | 
						|
import hash as wyhash
 | 
						|
import rand
 | 
						|
import benchmark
 | 
						|
 | 
						|
fn main() {
 | 
						|
	rand.seed([u32(42), 0])
 | 
						|
	sample_size := 10000000
 | 
						|
	min_str_len := 20
 | 
						|
	max_str_len := 40
 | 
						|
	println('Generating $sample_size strings between $min_str_len - $max_str_len chars long...')
 | 
						|
	mut checksum := u64(0)
 | 
						|
	mut start_pos := 0
 | 
						|
	mut bgenerating := benchmark.start()
 | 
						|
	mut bytepile := []u8{}
 | 
						|
	for _ in 0 .. sample_size * max_str_len {
 | 
						|
		bytepile << u8(rand.int_in_range(40, 125) or { 40 })
 | 
						|
	}
 | 
						|
	mut str_lens := []int{}
 | 
						|
	for _ in 0 .. sample_size {
 | 
						|
		str_lens << rand.int_in_range(min_str_len, max_str_len) or { min_str_len }
 | 
						|
	}
 | 
						|
	bgenerating.measure('generating strings')
 | 
						|
	println('Hashing each of the generated strings...')
 | 
						|
	//
 | 
						|
	mut bhashing_1 := benchmark.start()
 | 
						|
	start_pos = 0
 | 
						|
	checksum = 0
 | 
						|
	for len in str_lens {
 | 
						|
		end_pos := start_pos + len
 | 
						|
		checksum ^= wyhash.wyhash_c(unsafe { &u8(bytepile.data) + start_pos }, u64(len),
 | 
						|
			1)
 | 
						|
		start_pos = end_pos
 | 
						|
	}
 | 
						|
	bhashing_1.measure('wyhash.wyhash_c  | checksum: ${checksum:22}')
 | 
						|
	mut bhashing_2 := benchmark.start()
 | 
						|
	start_pos = 0
 | 
						|
	checksum = 0
 | 
						|
	for len in str_lens {
 | 
						|
		end_pos := start_pos + len
 | 
						|
		checksum ^= wyhash.sum64(bytepile[start_pos..end_pos], 1)
 | 
						|
		start_pos = end_pos
 | 
						|
	}
 | 
						|
	bhashing_2.measure('wyhash.sum64     | checksum: ${checksum:22}')
 | 
						|
	mut bhashing_3 := benchmark.start()
 | 
						|
	start_pos = 0
 | 
						|
	checksum = 0
 | 
						|
	for len in str_lens {
 | 
						|
		end_pos := start_pos + len
 | 
						|
		checksum ^= fnv1a.sum64(bytepile[start_pos..end_pos])
 | 
						|
		start_pos = end_pos
 | 
						|
	}
 | 
						|
	bhashing_3.measure('fnv1a.sum64      | checksum: ${checksum:22}')
 | 
						|
}
 |