Есть ли в Java реализованный метод hexToString для хеширования? - PullRequest
0 голосов
/ 08 апреля 2011

Я работаю в небольшом методе, который хэширует строку. В поисках информации я обнаружил, что MessageDigest может помочь мне выполнить эту задачу, здесь

Вычислить SHA-1 байтового массива

Но теперь у меня есть вопрос. Кажется, что процедура для хеширования строки в Java всегда одинакова:

  1. Вы создаете свой MessageDigester и указываете используемый алгоритм.
  2. Вы обновляете MessageDigester с помощью String для хэширования
  3. Затем вы вызываете MessageDigester.digest и получаете байт [].

Если одна из наиболее часто используемых функций хэша - это получить строковую версию этого хэша, почему (в вопросе, на который я ссылался, и некоторых других) люди должны реализовать свой метод convToHex?

private static String convToHex(byte[] data) {
            StringBuilder buf = new StringBuilder();
            for (int i = 0; i < data.length; i++) {
                int halfbyte = (data[i] >>> 4) & 0x0F;
                int two_halfs = 0;
                do {
                    if ((0 <= halfbyte) && (halfbyte <= 9))
                        buf.append((char) ('0' + halfbyte));
                    else
                            buf.append((char) ('a' + (halfbyte - 10)));
                    halfbyte = data[i] & 0x0F;
                } while(two_halfs++ < 1);
            }
            return buf.toString();
        }

Есть ли метод Java, который позволяет мне выполнять этот анализ между байтом [], возвращаемым MessageDigester и String ?? Если это существует, где это ?? Если нет, то почему я должен сделать свой собственный метод?

Спасибо.

1 Ответ

3 голосов
/ 08 апреля 2011

Вы можете использовать Commons Codec , который имеет класс Hex.Кроме того, вы можете написать преобразование намного короче, если не хотите включать другую зависимость:

private final static String HEX_CHARS = "0123456789ABCDEF";

@Override
public String toString() {
    String res = "";
    for(byte b : data) {
        res += HEX_CHARS.charAt((b >> 4) & 0xF);
        res += HEX_CHARS.charAt(b & 0xF);
    }
    return res;
}

(я знаю, я знаю, конкатенация строк в цикле, у меня есть байтовые массивыфиксированная короткая длина. Не стесняйтесь изменить его на использование StringBuilder.)

...