
高效哈希
更好的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 中同样存在,提供了最佳的原版兼容性。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。