2

我正在研究 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 函数是否足够好?会有更好的实现吗?

4

0 回答 0