我正在研究 Java 到 WebAssembly 的编译器 ( JWebAssembly )。我需要用可以在 WebAssembly 中运行的东西替换本机代码。
对于 java.lang.Object.hashCode() 和 java.lang.System.identityHashCode() 我目前使用以下 JavaScript 代码:
identityHashCode = (o) => {
var h = o[1];
while( h == 0 ){
o[1] = h = Math.round( ( Math.random() - 0.5 ) * 0xffff );
}
return h;
}
但这需要为每个新的 hashCode 往返一次到 JavaScript 范围,这会降低性能。对于像 WASI 这样的无浏览器环境(没有 JavaScript),这是行不通的。我寻找一个糟糕的替代品。
我认为一个hashCode:
- 不需要真的是随机的
- 值只能分布良好
这个对吗?
下面的 Java 代码应该足够好了。
private static int globalHash = (int)System.currentTimeMillis();
private int hashCode;
public int hashCode() {
if( hashCode == 0 ) {
hashCode = globalHash = (globalHash + 1) * 31;
}
return hashCode;
}
这对于通用 hashCode 函数是否足够好?会有更好的实现吗?