高效哈希

高效哈希

更好的Vec3i和BlockPos哈希算法

优化

EfficientHashing

EfficientHashing 将 Vec3i(及其子类如 BlockPos)的哈希算法替换为一种碰撞抵抗性更强的方法,在几乎所有使用其哈希码的地方提供性能提升。

抗碰撞性

我们可以通过一个简单的测试来证明这一点。测试对 new BlockPos(-100, -20, -100) 至 new BlockPos(100, 50, 100)(含)之间的每个 BlockPos 组合进行哈希,总对象数量超过 2,800,000 个。

原版算法总共生成了 194,571 个唯一哈希码。这意味着至少 93% 的 BlockPos 哈希码相互碰撞。

而 EfficientHashing 使用的 PhiMix 算法总共生成了 2,868,471 个唯一哈希码。这意味着每个唯一的 BlockPos 对象都有其唯一的哈希码,且所有 BlockPos 哈希码之间没有任何碰撞。

唯一哈希码 碰撞次数 碰撞率
原版 194,571 2,673,900 93.2%
EfficientHashing 2,868,471 0 0%

如果你对实际的测试代码感兴趣,请参见:这里

性能

基准测试时间:

Benchmark                     Mode  Cnt   Score   Error  Units
VecHashingBenchmark.mixin    thrpt    5  47.012 ± 1.029  ops/s
VecHashingBenchmark.vanilla  thrpt    5  49.326 ± 1.507  ops/s

PhiMix 的性能约为原始哈希算法的 95.3%。是的,它更慢,但这个性能差距与其他哈希解决方案相比相对较小,并且很容易被抗碰撞性的显著提升所抵消。

如果你对实际的基准测试代码感兴趣,请参见:这里

原版兼容性

在原版哈希算法中,如果你对 BlockPos/Vec3i 的“默认”实例,即 new BlockPos(0, 0, 0) 进行哈希,生成的哈希码将是 0,这正好是整数的“默认”实例。这一特殊行为在 PhiMix 中同样存在,提供了最佳的原版兼容性。