Androidで文字列入力用の一意のハッシュコードを生成するには...?
Androidに入力された文字列に対して一意のハッシュコードを生成したかった。事前定義されたライブラリがありますか、手動で生成する必要があります。リンクまたはコードを提示してください。
それはあなたの意味に依存します:
前述のように、
String.hashCode()
は32ビットのハッシュコードを提供します。(たとえば)64ビットハッシュコードが必要な場合は、自分で簡単に実装できます。
文字列の暗号化ハッシュが必要な場合、Java暗号ライブラリにはMD5、SHA-1などの実装が含まれます。通常、文字列をバイト配列に変換する必要があります。次に、ハッシュジェネレーター/ダイジェストジェネレーターにフィードします(たとえば、@ Bryan Kempの回答を参照)。
一意のを保証されたハッシュコードが必要な場合は、運が悪いです。ハッシュとハッシュコードは一意ではありません。
A Java長さNの文字列には65536 ^ N
可能な状態があり、すべての可能な値を表すには16 * N
ビットの整数が必要です。整数を生成するハッシュ関数を記述する場合より小さい範囲(たとえば16 * N
ビット未満)では、複数のStringが同じ整数にハッシュする場合、つまり、ハッシュコードが一意でない場合があります。これは Pigeonhole Principleと呼ばれます 、そして単純な数学的な証明があります(数学と戦って勝つことはできません!)
ただし、一意でない可能性が非常に低い「おそらく一意」が許容される場合、暗号ハッシュは適切な答えです。数学は、特定の(十分に低い)非一意性の確率を達成するためにハッシュがどれくらいの大きさ(つまり、何ビット)でなければならないかを教えてくれます。
これは、メッセージダイジェストハッシュを作成するために使用するクラスです
import Java.security.MessageDigest;
import Java.security.NoSuchAlgorithmException;
public class Sha1Hex {
public String makeSHA1Hash(String input)
throws NoSuchAlgorithmException, UnsupportedEncodingException
{
MessageDigest md = MessageDigest.getInstance("SHA1");
md.reset();
byte[] buffer = input.getBytes("UTF-8");
md.update(buffer);
byte[] digest = md.digest();
String hexStr = "";
for (int i = 0; i < digest.length; i++) {
hexStr += Integer.toString( ( digest[i] & 0xff ) + 0x100, 16).substring( 1 );
}
return hexStr;
}
}
String input = "some input string";
int hashCode = input.hashCode();
System.out.println("input hash code = " + hashCode);
このコードを使用して、特定の文字列のhasコードを生成できます。
int hash = 7;
for (int i = 0; i < strlen; i++) {
hash = hash*31 + charAt(i);
}
これを使用して、EhCacheManager
メモリマップからキーとしてテストしました。
それはクリーナーだと思う
/**
* Return Hash256 of String value
*
* @param text
* @return
*/
public static String getHash256(String text) {
try {
return org.Apache.commons.codec.digest.DigestUtils.sha256Hex(text);
} catch (Exception ex) {
Logger.getLogger(HashUtil.class.getName()).log(Level.SEVERE, null, ex);
return "";
}
}
mavenを使用していますが、これはjarですcommons-codec-1.9.jar
Javaコードの数行。
public static void main(String args[]) throws Exception{
String str="test string";
MessageDigest messageDigest=MessageDigest.getInstance("MD5");
messageDigest.update(str.getBytes(),0,str.length());
System.out.println("MD5: "+new BigInteger(1,messageDigest.digest()).toString(16));
}
私にとってはうまくいった
public static long getUniqueLongFromString (String value){
return UUID.nameUUIDFromBytes(value.getBytes()).getMostSignificantBits();
}
株式のhashCode()メソッドを見てみましょう。
public int hashCode() {
int h = hash;
if (h == 0 && count > 0) {
for (int i = 0; i < count; i++) {
h = 31 * h + charAt(i);
}
hash = h;
}
return h;
}
上記のコードブロックは、Java.lang.Stringクラスからのものです。ご覧のとおり、これは32ビットのハッシュコードであり、小規模のデータで使用する場合は十分に公平です。 32ビット以上のハッシュコードを探している場合は、次のリンクをチェックアウトできます。 http://www.javamex.com/tutorials/collections/strong_hash_code_implementation.shtml