2012-01-22 2 views
0

文字列にハッシュ関数MD5を使用すると、非常に長い値が作成され、毎回同じ文字列に対して同じ値が作成されます。さて、私の質問です:同じような何かを行う方法は、それは文字列を与えると、同じ整数を毎回返すと、また、それは別の文字列のために返す整数は特定の間隔の内部です。つまり、thisのようなものです。ハッシュ値に似ていますが、intを返すもの

例:「メアリーは小さな子羊を持っていました」値10を返します。同じ文字列を与えると、10を返します。

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

+0

これは一意ではありません。 – SLaks

+0

文字列が一意であっても? 実際、そうでない場合でも、このための機能はありますか? – AndreiBogdan

+0

可能な整数は2^32です。可能な文字列の数は無限です。どう思いますか? – SLaks

答えて

1

"ハッシュ関数"について説明しています。それをWikipediaで見てください。

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

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

この場合、言語はJavascriptです(これは驚いたことに、このようなものが組み込まれていないようです)。これはJavaプラットフォームのString.hashCode()です(おそらく、 to 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; 
} 
+0

"MD5ハッシュを取得して、必要なサイズの整数を取得するのに必要な数の下位ビットを使用できます。どうぞあなたは詳しく教えていただけますか?可能であれば、簡単な例が素晴らしいでしょう。 (また、「必要なだけ多くの下位ビットを使用する」ことで、ユニークではないでしょうか?) – AndreiBogdan

+0

@AndreiBogdan:MD5ハッシュ自体は既にユニークではありません。 – SLaks

+0

ええと、私は関数が一意のキーを一意の文字列にマップすると考えました。異なる文字列、異なるキー。有意でないには低すぎる「失敗」率を伴います。 – AndreiBogdan

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 
関連する問題