同じ形式の異なる一意の文字列があります。文字列は次のようになりますaxf25!j&809>-11~dc
と私はこの文字列から一意の整数値を取得したいと思います。 この値は同じである必要があり、文字列に依存します。文字列の各文字をintに変換してから、文字を合計しました。しかし、同じ記号のセットを持つ2つの文字列がある場合は、互いに等しい整数値を返します。だから私には合わない。一意の文字列から一意の整数値を生成するにはどうすればよいですか?
更新:
与えられたすべてのソリューションを検討した結果、一意の整数値を生成する関数を作成することにしました。それが衝突を排除することを願っています。
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;
}
十分に長い文字列から完全に一意のint
sを生成することはできません 2ビット整数よりも10文字の文字列が多いため 。
非一意のソリューションに関する限り、標準のhashCode
関数を使用できます。Javaでの実装はかなり良いです。より複雑なものについては、暗号ハッシュの計算を検討することができます( SHA-2 、 MD5 など)
String.hashCode()
(たとえば、mystring.hashCode()
)を使用してある程度の一意性を与えることができますが、衝突を処理できることを確認する必要があります。
整数よりも多くの可能な文字列表現があるため、異なる文字列からの一意の整数値を保証することはできません。よく知られている/定義されているハッシュアルゴリズムを使用して、衝突の可能性を最小限に抑えることができます。 MD5またはSHAを確認する必要があります。
Java class MessageDigest が役立つはずです。
あなたはコードで試すことができます:
import Java.math.BigInteger;
public static BigInteger stringToBigInteger(String text) {
BigInteger bigInt = new BigInteger(text.getBytes());
return bigInt;
}
ありがとう。
文字列をベースとして扱う0x110000
いくつかの整数の表現(文字の範囲が制限されていることがわかっている場合は、より小さな基数で済ますことができます)。 BigInteger
に変換します。