Initial project import
This commit is contained in:
commit
23f2d29e32
11957 files changed
+1754577
No files matched your search
@@ -0,0 +1,44 @@
|
||||
// Copyright (c) 2019-2024 Alexander Medvednikov. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
//
|
||||
// this is an implementation of wyhash v4
|
||||
// from https://github.com/wangyi-fudan/wyhash
|
||||
//
|
||||
// TODO: use u128 once implemented
|
||||
// currently the C version performs slightly better
|
||||
// because it uses 128 bit int when available and
|
||||
// branch prediction hints. the C version will be
|
||||
// removed once the performance is matched.
|
||||
// you can test performance by running:
|
||||
// `v run cmd/tools/bench/wyhash.v`
|
||||
// try running with and without the `-prod` flag
|
||||
module hash
|
||||
|
||||
const wyp0 = u64(0x2d358dccaa6c78a5)
|
||||
const wyp1 = u64(0x8bb84b93962eacc9)
|
||||
const wyp2 = u64(0x4b33a62ed433d4a3)
|
||||
const wyp3 = u64(0x4d5a2da51de1aa47)
|
||||
|
||||
// wymum returns a hash by performing multiply and mix on `a` and `b`.
|
||||
@[ignore_overflow; inline]
|
||||
pub fn wymum(a u64, b u64) u64 {
|
||||
/*
|
||||
mut r := u128(a)
|
||||
r = r*b
|
||||
return (r>>64)^r
|
||||
*/
|
||||
mask32 := u32(4294967295)
|
||||
x0 := a & mask32
|
||||
x1 := a >> 32
|
||||
y0 := b & mask32
|
||||
y1 := b >> 32
|
||||
w0 := x0 * y0
|
||||
t := x1 * y0 + (w0 >> 32)
|
||||
mut w1 := t & mask32
|
||||
w2 := t >> 32
|
||||
w1 += x0 * y1
|
||||
hi := x1 * y1 + w2 + (w1 >> 32)
|
||||
lo := a * b
|
||||
return hi ^ lo
|
||||
}
|
||||
Reference in new issue
Block a user