web-dev-qa-db-ja.com

Javaの16進数から整数へ

String 16進数を整数に変換しようとしています。 16進数の文字列は、ハッシュ関数(sha-1)から計算されました。このエラーが発生します:Java.lang.NumberFormatException。 16進数の文字列表現が気に入らないと思います。どうすればそれを達成できますか。ここに私のコードがあります:

public Integer calculateHash(String uuid) {

    try {
        MessageDigest digest = MessageDigest.getInstance("SHA1");
        digest.update(uuid.getBytes());
        byte[] output = digest.digest();

        String hex = hexToString(output);
        Integer i = Integer.parseInt(hex,16);
        return i;           

    } catch (NoSuchAlgorithmException e) {
        System.out.println("SHA1 not implemented in this system");
    }

    return null;
}   

private String hexToString(byte[] output) {
    char hexDigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'A', 'B', 'C', 'D', 'E', 'F' };
    StringBuffer buf = new StringBuffer();
    for (int j = 0; j < output.length; j++) {
        buf.append(hexDigit[(output[j] >> 4) & 0x0f]);
        buf.append(hexDigit[output[j] & 0x0f]);
    }
    return buf.toString();

}

たとえば、次の文字列を渡すと、_ DTOWsHJbEeC6VuzWPawcLA、彼のハッシュは:xC934E5D372B2AB6D0A50B9F0341A00ED029BDC15

しかし、私は得る:Java.lang.NumberFormatException:入力文字列の場合: "xC934E5D372B2AB6D0A50B9F0341A00ED029BDC15"

これを本当にする必要があります。文字列であるUUIDで識別される要素のコレクションがあります。これらの要素を保存する必要がありますが、私の制限はidとして整数を使用することです。与えられたパラメーターのハッシュを計算してからintに変換する理由です。たぶん私はこれを間違っていますが、誰かが私にそれを正しく達成するためのアドバイスを与えることができます!!

ご協力いただきありがとうございます !!

28
Dimitri

なぜJava機能を使用しないのですか:

数字が小さい場合(自分よりも小さい場合)は、Integer.parseInt(hex, 16)を使用して、Hex-Stringを整数に変換できます。

_  String hex = "ff"
  int value = Integer.parseInt(hex, 16);  
_

あなたのような大きな数の場合は、public BigInteger(String val, int radix)を使用します

_  BigInteger value = new BigInteger(hex, 16);
_

@See JavaDoc:

87
Ralph

これを試して

public static long Hextonumber(String hexval)
    {
        hexval="0x"+hexval;
//      String decimal="0x00000bb9";
        Long number = Long.decode(hexval);
//.......       System.out.println("String [" + hexval + "] = " + number);
        return number;
        //3001
    }
1
wahid

このメソッドを使用できます: https://stackoverflow.com/a/31804061/3343174 それは完全に任意の16進数(文字列として表示)を変換します10進数

1
Fakher

私は最終的に、あなたのすべてのコメントに基づいて私の質問に対する答えを見つけます。おかげで、私はこれを試しました:

public Integer calculateHash(String uuid) {

    try {
        //....
        String hex = hexToString(output);
        //Integer i = Integer.valueOf(hex, 16).intValue();
        //Instead of using Integer, I used BigInteger and I returned the int value.
        BigInteger bi = new BigInteger(hex, 16);
        return bi.intValue();`
    } catch (NoSuchAlgorithmException e) {
        System.out.println("SHA1 not implemented in this system");
    }
    //....
}

このソリューションは最適ではありませんが、プロジェクトを続行できます。ご協力ありがとうございます

0
Dimitri

SHA-1は、intまたはlong値に格納するには大きすぎる160ビットのメッセージ(20バイト)を生成します。 Ralphが示唆するように、BigIntegerを使用できます。

(安全性の低い)intハッシュを取得するには、返されたバイト配列のハッシュコードを返します。

あるいは、SHAがまったく必要ない場合は、UUIDの文字列ハッシュコードを使用できます。