2012-05-09 7 views
1

値が文字列である重要でないタグがあります。タグ値の変更を確認する必要があります。しかし、これはクライアントとサーバーが関係しているため、文字列の比較を行うのではなく、文字列の値の種類を計算し、その値を使用して文字列の変更を検出する必要があります。文字列は重要ではないため、文字列の変更を検出するためのこのような値を計算するための非常に簡単で迅速なソリューションがあるのだろうかと思います。文字列の変更を検出するために文字列の署名をすばやく計算する方法はありますか?

+3

string.hashcode()? (ハッシュコードの衝突の危険性は低い) – assylias

答えて

2

それは非可逆ですので

String.hashCode()が完璧ではありません)(.hashCodeを使用してください。したがって、文字列が変更され、同じハッシュコードを持つ可能性があります。 (ただしこれは頻繁に起こることはありません)文字列が変更されるたびに、そのハッシュコードも変更されます。

あなたがに取得しているものを知っているので、String.hashCode()のコードはこれです:

public int hashCode() { 
    int h = hash; // the cached hash value 
    int len = count; // the number of characters in the string 
    if (h == 0 && len > 0) { 
     int off = offset; 
     char val[] = value; 

     for (int i = 0; i < len; i++) { 
      h = 31*h + val[off++]; 
     } 
     hash = h; 
    } 
    return h; 
} 
+0

これはしばしば十分に起こる。 'int'は32ビット幅です。 –

+0

1/2^32はしばしばですか? –

+0

はい。 http://preshing.com/wp-content/uploads/2011/05/probability-distribution.png –

0

はい。ただし、一意性が必要な場合はハッシュコードを使用しないでください。 SHA256ダイジェストを使用します。

String tag = "..."; 
MessageDigest md = MessageDigest.getInstance("SHA-256"); 
md.update(text.getBytes("UTF-8")); 
byte[] digest = md.digest(); 
+0

文字列の比較が望ましくないのはなぜか分かりませんが、バイト配列の比較はうまくいくでしょうか? –

+0

サイズだと思います...これについても質問の説明を歓迎します。 –

関連する問題