2013-07-11 51 views
9

同じ形式で異なる一意の文字列を使用しています。文字列はこのようになりますaxf25!j&809>-11~dcと私はこの文字列から一意の整数値を取得したい。 この値は毎回同じでなければならず、文字列によって異なります。私は文字列の各文字をintに変換しようとしました。そして、文字を互いに合計します。しかし、同じシンボルセットを持つ2つの文字列がある場合、互いに等しい整数値を返します。それは私に合っていません。一意の文字列から一意の整数値を生成するにはどうすればよいですか?文字列から一意の整数値を取得

UPDATE:

私は一意の整数値を生成する関数を作成することを決め、すべての与えられた解決策を検討しました。私はそれが衝突を排除することを願っています。

public int getUniqueInteger(String name){ 
    String plaintext = name; 
    int hash = name.hashCode(); 
    MessageDigest m; 
    try { 
     m = MessageDigest.getInstance("MD5"); 
     m.reset(); 
     m.update(plaintext.getBytes()); 
     byte[] digest = m.digest(); 
     BigInteger bigInt = new BigInteger(1,digest); 
     String hashtext = bigInt.toString(10); 
     // Now we need to zero pad it if you actually want the full 32 chars. 
     while(hashtext.length() < 32){ 
      hashtext = "0"+hashtext; 
     } 
     int temp = 0; 
     for(int i =0; i<hashtext.length();i++){ 
      char c = hashtext.charAt(i); 
      temp+=(int)c; 
     } 
     return hash+temp; 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return hash; 
} 
+0

なぜ、各文字をASCIIに変換するのに 'getBytes'を使用しないのですか?その後、それらを合計します。 – DevlshOne

+2

'String#hashCode()'を使用しますか? –

+1

hashCodeは一意性を保証しません! – Nolesh

答えて

8

十分に長い文字列because there are more 10-character strings than 32-bit integersから完全に一意のintを生成することはできません。

独自の解決策がない限り、標準のhashCode関数を使用することができます。そのJavaでの実装はかなり適切です。より複雑なものについて、あなたは文字の範囲がわかっている場合(あなたは小さなベースで逃げることができ、いくつかの整数のベース0x110000表現として文字列を扱う

+0

hashCodeは一意性を保証しません! – Nolesh

3

整数よりも文字列表現が多い可能性があるため、異なる文字列から一意の整数値を保証することはできません。コリジョンの可能性を最小限に抑えるために、いくつかのよく知られた/定義されたハッシュアルゴリズムを使用することができます。あなたはMD5かSHAを見るべきです。

Javaクラスを使用する必要があります。

+0

なぜここにdownvote? –

+0

整数値を取得する方法は不明です。この関数はバイト配列を返します。 – shakram02

7

一意性を与えるためにString.hashCode()(例:mystring.hashCode())を使用しても問題はありませんが、確実に衝突を処理する必要があります。

0

SHA-2MD5など)を暗号化ハッシュを計算し検討することができます限定された)。 BigIntegerに変換してください。

1

あなたがコードで試すことができます。

import java.math.BigInteger; 

public static BigInteger stringToBigInteger(String text) { 
    BigInteger bigInt = new BigInteger(text.getBytes()); 
    return bigInt; 
} 

感謝。

関連する問題