0

Как сгенерировать уникальный хеш-код для строкового ввода в Android?

93

Я хотел бы сгенерировать уникальный хеш-код для строки во время ввода в Android. Существует ли какая-либо предопределенная библиотека для этой задачи или мне нужно реализовать это вручную? Если кто-то знает, пожалуйста, приведите ссылку или пример кода.

5 ответ(ов)

0

Чтобы создать хеши с использованием алгоритма SHA-1 в Java, вы можете воспользоваться следующим классом, который реализует эту функциональность. Этот код принимает строку в качестве входных данных и возвращает её SHA-1 хеш в шестнадцатеричном формате.

Вот пример реализации класса Sha1Hex:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.UnsupportedEncodingException;

public class Sha1Hex {

    public String makeSHA1Hash(String input)
            throws NoSuchAlgorithmException, UnsupportedEncodingException {
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        md.reset();
        byte[] buffer = input.getBytes("UTF-8");
        md.update(buffer);
        byte[] digest = md.digest();

        StringBuilder hexStr = new StringBuilder();
        for (byte b : digest) {
            hexStr.append(String.format("%02x", b));
        }
        return hexStr.toString();
    }
}

Пояснение:

  1. Импортируем необходимые библиотеки: Вам понадобятся MessageDigest для создания хешей, а также классы для обработки исключений.
  2. Метод makeSHA1Hash: Этот метод принимает строку input и выбрасывает исключения NoSuchAlgorithmException и UnsupportedEncodingException в случае ошибки.
  3. Создание объекта MessageDigest: Используем MessageDigest.getInstance("SHA-1") для инициализации алгоритма SHA-1.
  4. Обновление данных: Метод md.update() принимает байтовую последовательность, полученную из строки ввода.
  5. Генерация хеша: Метод md.digest() возвращает байтовый массив — хеш.
  6. Форматирование хеша в шестнадцатеричный вид: Вместо конкатенации строк я использую StringBuilder для улучшения производительности и String.format() для форматирования каждого байта в соответствующий шестнадцатеричный формат.

Таким образом, класс Sha1Hex позволяет легко генерировать SHA-1 хеши строк.

0

Вы можете использовать следующий код на Java для вычисления хеш-кода строки:

String input = "some input string";
int hashCode = input.hashCode();
System.out.println("Хеш-код входной строки = " + hashCode);

В этом коде мы создаём строку input, вызываем метод hashCode() для получения её хеш-кода и затем выводим результат на консоль. Хеш-код представляет собой целое число, которое служит уникальной идентификацией для данной строки в пределах приложения.

0

Чтобы улучшить читаемость и избежать лишних вопросов, можно предложить следующее:

Код, который вы привели, выглядит вполне чистым и эффективным для генерации SHA-256 хеша строки. Вы используете commons-codec для этой цели, что является хорошей практикой, так как эта библиотека хорошо зарекомендовала себя.

Вот ваш метод с пояснением:

/**
 * Возвращает SHA-256 хеш для заданной строки
 *
 * @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 ""; // Возвращаем пустую строку в случае ошибки
    }
}

Обратите внимание на следующие моменты:

  1. Обработка ошибок: В случае возникновения исключения метод возвращает пустую строку и создает запись в журнале. Это может быть полезно для отладки, но вы можете рассмотреть возможность дальнейшей обработки ошибок в вашем коде, чтобы избежать ситуаций, когда метод возвращает пустое значение.

  2. Зависимости Maven: Вы упомянули, что используете commons-codec-1.9.jar. Убедитесь, что у вас в pom.xml указана соответствующая зависимость, чтобы избежать проблем с отсутствующими библиотеками. Пример для добавления:

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.9</version>
</dependency>

В итоге, ваше решение выглядит хорошо, но помните о возможных улучшениях в части обработки ошибок и пригодности для дальнейшего использования. Если у вас есть дополнительные вопросы или нуждаетесь в улучшении, не стесняйтесь спрашивать!

0

Для меня это сработало:

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

Этот метод генерирует уникальное значение типа long на основе переданной строки. Используется метод nameUUIDFromBytes, который создает UUID, а затем извлекаются его старшие 64 бита при помощи метода getMostSignificantBits(). Таким образом, можно получить уникальный идентификатор для различных строк.

0

Вы можете использовать следующий код для генерации хэш-кода для заданной строки:

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

Как это работает: мы начинаем с начального значения хэша (в данном случае 7) и проходимся по каждому символу строки. Для каждого символа мы умножаем текущий хэш на 31 и добавляем значение символа. Это позволяет получить уникальный хэш-код для данной строки. Не забудьте заменить strlen на фактическую длину строки и charAt(i) на способ получения символа по индексу, в зависимости от языка программирования, который вы используете.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь