Целочисленный хэш в строковое значение - PullRequest
0 голосов
/ 25 ноября 2010

Я хочу вычислить Hash для строки, но значение Hash должно быть числом (длинным или целым).

Другими словами, я хочу вычислить целочисленный хэш строки.Сопротивление сговору не касается.

Есть ли способ конвертировать MessageDigest из SHA-256 в число.

Я использую Java для достижения этой цели.

Ответы [ 7 ]

1 голос
/ 25 ноября 2010

Очевидно, что hashCode()

явно существует метод *1001* Что касается преобразования MessageDigest в число, вы можете либо снова использовать hashCode, либо взять массив byte из дайджеста иСократите это до любого желаемого размера, целого, длинного или любого другого с (скажем) xor.

public int compactDigest(MessageDigest digest) {
    byte [] byteArr = digest.digest();
    // +3 since conversion to int array with divide length by four.
    // and we don't want to lose any bytes.
    ByteBuffer bytes = ByteBuffer.allocate(byteArr.length + 3);
    bytes.put(byteArr);
    bytes.rewind();

    IntBuffer ints = bytes.asIntBuffer();
    int compactDigest = 0;
    for (int i = 0; i < ints.limit(); ++i) {
      compactDigest ^= ints.get(i);
    }

    return compactDigest;
}
1 голос
/ 25 ноября 2010

Попробуйте вызвать метод hashCode (). Он уже реализован и делает именно то, что вы хотите.

0 голосов
/ 25 ноября 2010

Криптографические хеши, созданные с использованием классов JCE (в вашем случае MessageDigest), по сути, представляют собой последовательность байтов (256 бит для SHA-256).Если вы хотите хранить эти числа и управлять ими, вам необходимо преобразовать их в объекты BigInteger или BigDecimal (с учетом длины дайджеста).

Не всегда криптографический хэш объектов Stringвычисляется, и это часто делается с целью одностороннего шифрования секретов.Если вы используете хеш для других целей, особенно для обеспечения какой-то уникальности между строками (что важно при хранении этих объектов в хэш-карте), лучше использовать значение хеша, вычисленное с помощью Метод String.hashCode .

0 голосов
/ 25 ноября 2010

Пожалуйста, найдите его здесь: http://pastebin.com/j6Cffkcp;

I, но он возвращает только строку.

0 голосов
/ 25 ноября 2010

Sha Hash имеет 256 битов, например

"364b7e70a9966ef7686ab814958cd0017b7f19147a257d40603d4a1307662b42"

это будет превышать диапазон длинных и целых чисел. Вы можете использовать new BigInteger( hash, 16 ); для десятичного представления.

public static void main(String[] args) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        digest.update("string".getBytes() );
        byte[] hash = digest.digest();
        BigInteger bi = new BigInteger( hash );
        System.out.println( "hex:" + bi.toString(16) + "\r\ndec:" + bi.toString() );
    }
0 голосов
/ 25 ноября 2010

каждый объект в Java имеет hashCode() метод.Вы можете переопределить это и указать свою собственную логику.Посмотрите на примеры .

0 голосов
/ 25 ноября 2010

class String имеет метод hashcode, как и любой другой класс Java, который преобразует строку в число. См. документацию этого метода для точного алгоритма, который он использует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...