No hash function is perfect, but some are useful.
====
wyhash and wyrand are the ideal 64-bit hash function and PRNG respectively:
**solid**: wyhash passed SMHasher, wyrand passed BigCrush, practrand.
**portable**: 64-bit/32-bit system, big/little endian.
**fastest**: Efficient on 64-bit machines, especially for short keys.
**simplest**: In the sense of code size.
**salted**: We use dynamic secret to avoid intended attack.
wyhash is the default hashing algorithm of the great [Zig](https://ziglang.org), [V](https://vlang.io), [Nim](https://nim-lang.org) and [Go (since 1.17)](https://golang.org/src/runtime/hash64.go) language.
**Simple Example:**
```
#include "wyhash.h"
uint64_t _wyp[4];
make_secret(time(NULL),_wyp);
string s="fcdskhfjs";
uint64_t h=wyhash(s.c_str(),s.size(),0,_wyp);
```
----------------------------------------
g++-9 benchmark.cpp t1ha/src/t1ha2.c -o benchmark -Ofast -s -Wall -march=native
/usr/share/dict/words
|**wyhash_final3** |419.63 |20.97 |25.10 |
|wyhash_final2 |204.08 |21.12 |25.10 |
|wyhash_final1 |196.33 |15.56 |17.92 |
|wyhash_gamma (dangerous) |399.92 |19.16 |25.80 |
|wyhash_beta |180.51 |18.20 |17.37 |
|wyhash_alpha |204.50 |20.54 |25.92 |
|wyhash_v6 (avx2) |164.08 |12.08 |41.35 |
|wyhash_v5 |221.59 |15.40 |16.78 |
|wyhash_v4 |153.03 |13.89 |16.81 |
|wyhash_v3 |191.32 |13.55 |15.72 |
|wyhash_v2 |94.28 |11.91 |11.22 |
|wyhash_v1 |91.66 |16.03 |18.95 |
|wyhash32 (32 bit) |149.78 |5.45 |4.89 |
|xxh3_scalar |152.47 |8.39 |13.05 |
|xxh3_avx2 |144.62 |9.85 |44.82 |
----------------------------------------
**C#** https://github.com/cocowalla/wyhash-dotnet
**C++** https://github.com/tommyettinger/waterhash
**GO** https://github.com/dgryski/go-wyhash
**GO** https://github.com/orisano/wyhash
**GO** https://github.com/littleli/go-wyhash16
**GO** https://github.com/zeebo/wyhash
**GO** https://github.com/lonewolf3739/wyhash-go
**GO** https://github.com/zhangyunhao116/wyhash (final version 1)
**Java** https://github.com/OpenHFT/Zero-Allocation-Hashing
**Nim** https://github.com/nim-lang/Nim/blob/devel/lib/pure/hashes.nim
**Nim** https://github.com/jackhftang/wyhash.nim
**Nim** https://github.com/littleli/nim-wyhash16
**Rust** https://github.com/eldruin/wyhash-rs
**Swift** https://github.com/lemire/SwiftWyhash
**Swift** https://github.com/lemire/SwiftWyhashBenchmark
**Swift** https://github.com/jeudesprits/PSWyhash
**V** https://github.com/vlang/v/tree/master/vlib/hash/wyhash (v4)
**Zig** https://github.com/ManDeJan/zig-wyhash
**absl hashmap** https://github.com/abseil/abseil-cpp/blob/master/absl/hash/internal/wyhash.cc
----------------------------------------
I thank these names:
Reini Urban
Dietrich Epp
Joshua Haberman
Tommy Ettinger
Daniel Lemire
Otmar Ertl
cocowalla
leo-yuriev
Diego Barrios Romero
paulie-g
dumblob
Yann Collet
ivte-ms
hyb
James Z.M. Gao
easyaspi314 (Devin)
TheOneric