ogxd / gxhash

The fastest hashing algorithm 📈
https://docs.rs/gxhash
MIT License
696 stars 23 forks source link

Create dedicated quality bench #45

Closed ogxd closed 6 months ago

ogxd commented 6 months ago
ogxd commented 6 months ago

Here is the current output of this bench:

Bench GxHash
  ✅ avalanche::<B,4>()
  ✅ avalanche::<B,10>()
  ✅ avalanche::<B,32>()
  ✅ avalanche::<B,128>()
  ✅ avalanche::<B,512>()
  ✅ distribution_values::<B,4>(128*128)
  ✅ distribution_values::<B,16>(128*128)
  ✅ distribution_values::<B,128>(128*128)
  ✅ distribution_values::<B,512>(128*128)
  ✅ distribution_bits::<B,4>()
  ✅ distribution_bits::<B,16>()
  ✅ distribution_bits::<B,128>()
  ✅ distribution_bits::<B,512>()
  ✅ collisions_padded_zeroes::<B>(128*128)
  ✅ collisions_flipped_n_bits::<B,2>(9)
  ✅ collisions_flipped_n_bits::<B,3>(9)
  ✅ collisions_flipped_n_bits::<B,4>(7)
  ✅ collisions_flipped_n_bits::<B,5>(6)
  ✅ collisions_flipped_n_bits::<B,6>(5)
  ✅ collisions_flipped_n_bits::<B,7>(5)
  ✅ collisions_flipped_n_bits::<B,9>(4)
  ✅ collisions_flipped_n_bits::<B,20>(4)
  ✅ collisions_flipped_n_bits::<B,32>(3)
  ✅ collisions_flipped_n_bits::<B,64>(3)
  ✅ collisions_flipped_n_bits::<B,256>(2)
  ✅ collisions_powerset_bytes::<B>(&[0,1,2,3,4,5,6,7,8,9])
  ❌ collisions_permuted_hasher_values::<B,u8>(&[0,1,2,3,4,5,6,7,8,9])
     | Score: 0.9999997244268077. Expected is 0.
  ❌ collisions_permuted_hasher_values::<B,u32>(&[0,1,2,3,4,5,6,7,8,9])
     | Score: 0.9999997244268077. Expected is 0.
  ❌ collisions_powerset_hasher_values::<B,u32>(&[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])
     | Score: 0.9960498809814453. Expected is 0.
Bench AHash
  ✅ avalanche::<B,4>()
  ✅ avalanche::<B,10>()
  ✅ avalanche::<B,32>()
  ✅ avalanche::<B,128>()
  ✅ avalanche::<B,512>()
  ✅ distribution_values::<B,4>(128*128)
  ✅ distribution_values::<B,16>(128*128)
  ✅ distribution_values::<B,128>(128*128)
  ✅ distribution_values::<B,512>(128*128)
  ✅ distribution_bits::<B,4>()
  ✅ distribution_bits::<B,16>()
  ✅ distribution_bits::<B,128>()
  ✅ distribution_bits::<B,512>()
  ✅ collisions_padded_zeroes::<B>(128*128)
  ✅ collisions_flipped_n_bits::<B,2>(9)
  ✅ collisions_flipped_n_bits::<B,3>(9)
  ✅ collisions_flipped_n_bits::<B,4>(7)
  ✅ collisions_flipped_n_bits::<B,5>(6)
  ✅ collisions_flipped_n_bits::<B,6>(5)
  ✅ collisions_flipped_n_bits::<B,7>(5)
  ✅ collisions_flipped_n_bits::<B,9>(4)
  ✅ collisions_flipped_n_bits::<B,20>(4)
  ✅ collisions_flipped_n_bits::<B,32>(3)
  ✅ collisions_flipped_n_bits::<B,64>(3)
  ✅ collisions_flipped_n_bits::<B,256>(2)
  ✅ collisions_powerset_bytes::<B>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_permuted_hasher_values::<B,u8>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_permuted_hasher_values::<B,u32>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_powerset_hasher_values::<B,u32>(&[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])
Bench T1ha
  ✅ avalanche::<B,4>()
  ✅ avalanche::<B,10>()
  ✅ avalanche::<B,32>()
  ✅ avalanche::<B,128>()
  ✅ avalanche::<B,512>()
  ✅ distribution_values::<B,4>(128*128)
  ✅ distribution_values::<B,16>(128*128)
  ✅ distribution_values::<B,128>(128*128)
  ✅ distribution_values::<B,512>(128*128)
  ✅ distribution_bits::<B,4>()
  ✅ distribution_bits::<B,16>()
  ✅ distribution_bits::<B,128>()
  ✅ distribution_bits::<B,512>()
  ✅ collisions_padded_zeroes::<B>(128*128)
  ✅ collisions_flipped_n_bits::<B,2>(9)
  ✅ collisions_flipped_n_bits::<B,3>(9)
  ✅ collisions_flipped_n_bits::<B,4>(7)
  ✅ collisions_flipped_n_bits::<B,5>(6)
  ✅ collisions_flipped_n_bits::<B,6>(5)
  ✅ collisions_flipped_n_bits::<B,7>(5)
  ✅ collisions_flipped_n_bits::<B,9>(4)
  ✅ collisions_flipped_n_bits::<B,20>(4)
  ✅ collisions_flipped_n_bits::<B,32>(3)
  ✅ collisions_flipped_n_bits::<B,64>(3)
  ✅ collisions_flipped_n_bits::<B,256>(2)
  ✅ collisions_powerset_bytes::<B>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_permuted_hasher_values::<B,u8>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_permuted_hasher_values::<B,u32>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_powerset_hasher_values::<B,u32>(&[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])
Bench XxHash3
  ✅ avalanche::<B,4>()
  ✅ avalanche::<B,10>()
  ✅ avalanche::<B,32>()
  ✅ avalanche::<B,128>()
  ✅ avalanche::<B,512>()
  ✅ distribution_values::<B,4>(128*128)
  ✅ distribution_values::<B,16>(128*128)
  ✅ distribution_values::<B,128>(128*128)
  ✅ distribution_values::<B,512>(128*128)
  ✅ distribution_bits::<B,4>()
  ✅ distribution_bits::<B,16>()
  ✅ distribution_bits::<B,128>()
  ✅ distribution_bits::<B,512>()
  ✅ collisions_padded_zeroes::<B>(128*128)
  ✅ collisions_flipped_n_bits::<B,2>(9)
  ✅ collisions_flipped_n_bits::<B,3>(9)
  ✅ collisions_flipped_n_bits::<B,4>(7)
  ✅ collisions_flipped_n_bits::<B,5>(6)
  ✅ collisions_flipped_n_bits::<B,6>(5)
  ✅ collisions_flipped_n_bits::<B,7>(5)
  ✅ collisions_flipped_n_bits::<B,9>(4)
  ✅ collisions_flipped_n_bits::<B,20>(4)
  ✅ collisions_flipped_n_bits::<B,32>(3)
  ✅ collisions_flipped_n_bits::<B,64>(3)
  ✅ collisions_flipped_n_bits::<B,256>(2)
  ✅ collisions_powerset_bytes::<B>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_permuted_hasher_values::<B,u8>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_permuted_hasher_values::<B,u32>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_powerset_hasher_values::<B,u32>(&[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])
Bench Default
  ✅ avalanche::<B,4>()
  ✅ avalanche::<B,10>()
  ✅ avalanche::<B,32>()
  ✅ avalanche::<B,128>()
  ✅ avalanche::<B,512>()
  ✅ distribution_values::<B,4>(128*128)
  ✅ distribution_values::<B,16>(128*128)
  ✅ distribution_values::<B,128>(128*128)
  ✅ distribution_values::<B,512>(128*128)
  ✅ distribution_bits::<B,4>()
  ✅ distribution_bits::<B,16>()
  ✅ distribution_bits::<B,128>()
  ✅ distribution_bits::<B,512>()
  ✅ collisions_padded_zeroes::<B>(128*128)
  ✅ collisions_flipped_n_bits::<B,2>(9)
  ✅ collisions_flipped_n_bits::<B,3>(9)
  ✅ collisions_flipped_n_bits::<B,4>(7)
  ✅ collisions_flipped_n_bits::<B,5>(6)
  ✅ collisions_flipped_n_bits::<B,6>(5)
  ✅ collisions_flipped_n_bits::<B,7>(5)
  ✅ collisions_flipped_n_bits::<B,9>(4)
  ✅ collisions_flipped_n_bits::<B,20>(4)
  ✅ collisions_flipped_n_bits::<B,32>(3)
  ✅ collisions_flipped_n_bits::<B,64>(3)
  ✅ collisions_flipped_n_bits::<B,256>(2)
  ✅ collisions_powerset_bytes::<B>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_permuted_hasher_values::<B,u8>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_permuted_hasher_values::<B,u32>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_powerset_hasher_values::<B,u32>(&[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])
Bench FNV-1a
  ❌ avalanche::<B,4>()
     | Score: 0.36. Expected is 0.
  ❌ avalanche::<B,10>()
     | Score: 0.17. Expected is 0.
  ❌ avalanche::<B,32>()
     | Score: 0.08. Expected is 0.
  ❌ avalanche::<B,128>()
     | Score: 0.05. Expected is 0.
  ❌ avalanche::<B,512>()
     | Score: 0.04. Expected is 0.
  ✅ distribution_values::<B,4>(128*128)
  ✅ distribution_values::<B,16>(128*128)
  ✅ distribution_values::<B,128>(128*128)
  ✅ distribution_values::<B,512>(128*128)
  ✅ distribution_bits::<B,4>()
  ✅ distribution_bits::<B,16>()
  ✅ distribution_bits::<B,128>()
  ✅ distribution_bits::<B,512>()
  ✅ collisions_padded_zeroes::<B>(128*128)
  ✅ collisions_flipped_n_bits::<B,2>(9)
  ✅ collisions_flipped_n_bits::<B,3>(9)
  ✅ collisions_flipped_n_bits::<B,4>(7)
  ✅ collisions_flipped_n_bits::<B,5>(6)
  ✅ collisions_flipped_n_bits::<B,6>(5)
  ✅ collisions_flipped_n_bits::<B,7>(5)
  ✅ collisions_flipped_n_bits::<B,9>(4)
  ✅ collisions_flipped_n_bits::<B,20>(4)
  ✅ collisions_flipped_n_bits::<B,32>(3)
  ✅ collisions_flipped_n_bits::<B,64>(3)
  ✅ collisions_flipped_n_bits::<B,256>(2)
  ✅ collisions_powerset_bytes::<B>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_permuted_hasher_values::<B,u8>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_permuted_hasher_values::<B,u32>(&[0,1,2,3,4,5,6,7,8,9])
  ✅ collisions_powerset_hasher_values::<B,u32>(&[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])
ogxd commented 6 months ago

It can probably be improved, but I consider it good enough for now, at least to tackle the permutation issue