0

文字列に対してハッシュ関数MD5を使用すると、非常に長い値が作成され、同じ文字列に対して毎回同じ値が作成されます。さて、私の質問は次のとおりです。文字列を与えるなど、同じようなことをする方法はありますか。毎回同じ整数を返します。また、異なる文字列に対して返す整数は特定の間隔内にあります。私が言いたいのはこのようなものです。

例:「メアリーは小さな子羊を飼っていた」と言ってください。そして、値10を返します。同じ文字列を指定すると、再び10が返されます。

私が完全にはっきりしていなかった場合に備えて、尋ねてください。

4

2 に答える 2

1

あなたは「ハッシュ関数」について説明しています。ウィキペディアで調べてください。

MD5はハッシュ関数の一種です。ほとんどのMD5実装は文字列を返しますが、その文字列は(LARGE)整数の単なる表現です。MD5ハッシュを取得してから、必要な数の下位ビットを使用して、目的のサイズの整数を取得できます。目的の範囲が2の累乗でない場合は、モジュロ演算を実行して目的の範囲に入れる必要があります。

また、事実上すべての最新のプログラミング言語には、整数を返す文字列をハッシュするための組み込み関数があります。Javaでは、String.hashCode()です。Rubyでは、String#hashです。

この場合、言語はJavascriptであり、(私はショックを受けて)このようなものが組み込まれていないようです。これはJavaプラットフォームのString.hashCode()です(おそらくJavascriptに移植できます)。

public int hashCode() {
int h = hash;
if (h == 0) {
    int off = offset;
    char val[] = value;
    int len = count;

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }
        hash = h;
    }
    return h;
}
于 2012-01-22T18:07:06.583 に答える
1

MD5ハッシュの下位バイトを使用できます。JavaScript(少なくともFirefox 9では)は48ビット(6バイト)のようなものを使用して正確な整数を格納できることを考慮する必要があります。一方、MD5ハッシュの長さは128ビット(16バイト)です。したがって、MD5で通常発生するよりも多くのハッシュ衝突が必然的に発生します。それでも:

function toHashCode(str)
{
  // Convert string to an array of bytes
  var array = Array.prototype.slice.call(str);

  // Create MD5 hash
  var hashEngine = Components.classes["@mozilla.org/security/hash;1"]
                             .createInstance(Components.interfaces.nsICryptoHash);
  hashEngine.init(hashEngine.MD5);
  hashEngine.update(array, array.length);
  var hash = hashEngine.finish(false);

  // Turn the first 6 bytes of the hash into a number
  var result = 0;
  for (var i = 0; i < 6; i++)
    result = result * 256 + hash.charCodeAt(i);
  return result;
}

alert(toHashCode("test"));  // Displays 265892827251497
alert(toHashCode("Mary had a little lamb."));   // Displays 117938552300214
于 2012-01-23T08:49:23.083 に答える