web-dev-qa-db-ja.com

Androidで文字列入力用の一意のハッシュコードを生成するには...?

Androidに入力された文字列に対して一意のハッシュコードを生成したかった。事前定義されたライブラリがありますか、手動で生成する必要があります。リンクまたはコードを提示してください。

47
Shashikant

それはあなたの意味に依存します:

  • 前述のように、String.hashCode()は32ビットのハッシュコードを提供します。

  • (たとえば)64ビットハッシュコードが必要な場合は、自分で簡単に実装できます。

  • 文字列の暗号化ハッシュが必要な場合、Java暗号ライブラリにはMD5、SHA-1などの実装が含まれます。通常、文字列をバイト配列に変換する必要があります。次に、ハッシュジェネレーター/ダイジェストジェネレーターにフィードします(たとえば、@ Bryan Kempの回答を参照)。

  • 一意のを保証されたハッシュコードが必要な場合は、運が悪いです。ハッシュとハッシュコードは一意ではありません。

A Java長さNの文字列には65536 ^ N可能な状態があり、すべての可能な値を表すには16 * Nビットの整数が必要です。整数を生成するハッシュ関数を記述する場合より小さい範囲(たとえば16 * Nビット未満)では、複数のStringが同じ整数にハッシュする場合、つまり、ハッシュコードが一意でない場合があります。これは Pigeonhole Principleと呼ばれます 、そして単純な数学的な証明があります(数学と戦って勝つことはできません!)

ただし、一意でない可能性が非常に低い「おそらく一意」が許容される場合、暗号ハッシュは適切な答えです。数学は、特定の(十分に低い)非一意性の確率を達成するためにハッシュがどれくらいの大きさ(つまり、何ビット)でなければならないかを教えてくれます。

59
Stephen C

これは、メッセージダイジェストハッシュを作成するために使用するクラスです

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;
        }
}
34
Bryan Kemp
String input = "some input string";
int hashCode = input.hashCode();
System.out.println("input hash code = " + hashCode);
8
Boris Pavlović

このコードを使用して、特定の文字列のhasコードを生成できます。

int hash = 7;
for (int i = 0; i < strlen; i++) {
    hash = hash*31 + charAt(i);
}
3
Manmohan Soni

これを使用して、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

2
shareef

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));
}
1
Durgpal Singh

私にとってはうまくいった

   public static long getUniqueLongFromString (String value){
       return  UUID.nameUUIDFromBytes(value.getBytes()).getMostSignificantBits();
    }
0
Raluca Lucaci

株式の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

0
ngaspama