Как я могу сгенерировать 16-символьный хэш MD5 в Java?

Мне нужно сгенерировать на Kotlin хэш MD5 для некоторых данных, но в виде 16-символьной строки, а не 32-символьной. На данный момент я не нашел способа для этого и нуждаюсь в помощи. Но метод определенно есть, так как я нашел сайт, где это делают правильно.

Например эти сайты:

В качестве контроля я использую эту строку - "1681799732000". Первый сайт выдает правильный ответ из 16 символов — «92AA8DDBE039D480», Вторая ссылка — 32-значную строку — «E292561C92AA8DDBE039D4808CC51159».

Сгенерировать 32-символьный MD5 в Котлине не проблема, а вот 16-символьный — на самом деле.

РЕДАКТИРОВАТЬ 1 - Кодировка предположительно UTF-8

Невозможно представить MD5 (128 бит) в 16 печатных символах. Какую проблему ты пытаешься решить?

Augusto 31.07.2023 20:10

Мне нужно реализовать некоторую функцию входа в систему, которая использует эту строку md5 в каком-то алгоритме. Ссылки, описанные в моем сообщении, делают именно то, что мне нужно, так как у меня есть контрольная строка. То есть это возможно в некотором роде. Пожалуйста, посмотрите ссылку ...md516. Есть кнопка с надписью MD5 Hash_16 Uppercase. Это дает мне правильную строку управления.

Sargius 31.07.2023 20:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

  1. Сначала создайте хэш MD5 из данной строки. Затем возьмите из него первые 16 символов.
  2. Если результирующей строки нет в базе данных, она уникальна, и все готово. В противном случае перейдите к шагу 3.
  3. Добавьте предопределенную строку к исходной строке. Затем перейдите к шагу 1.

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

Sargius 31.07.2023 20:29
Ответ принят как подходящий

Если вы поместите свою контрольную строку в каждую из них, которую вы получите:

16:         92aa8ddbe039d480
32: e292561c92aa8ddbe039d4808cc51159

16-символьный результат выглядит как 32-символьный результат с удаленными первыми и последними 8 символами.

Ух ты! Спасибо. Что со мной случилось, лол? Я переутомился :)

Sargius 31.07.2023 20:58

Хотя это может быть то, что искал ОП, это не отвечает на фактически заданный вопрос. Вопрос спрашивает, как сгенерировать 16-символьный хэш MD5, на который ответ «нельзя». Взятие подстроки хэша лишает цели, потому что она может больше не быть уникальной. Нет смысла что-то хэшировать, просто возьмите 16 символов из исходной строки и назовите это хорошим.

Abhijit Sarkar 31.07.2023 21:11

@AbhijitSarkar Хэши по определению не уникальны. Взятие подстроки хэша — очень распространенный способ создания хэша с меньшим битовым пространством. Существует большая разница между использованием первых 16 символов строки и получением первых 16 символов хеша строки — у последнего есть свои особенности. Но вы правы: мы не можем сказать, что это «16-символьный хэш MD5». Это 32-символьный MD5 с некоторой пользовательской постобработкой.

broot 31.07.2023 21:38

@broot Мне неизвестно какое-либо определение хэш-кода, которое требует, чтобы он не был уникальным, поэтому я не знаю, на какое определение вы намекаете. Хотя она не обязана генерировать уникальные коды, хорошая хеш-функция предназначена для равномерного отображения во всем диапазоне, что естественным образом создает уникальные хеш-коды, насколько это возможно. Тем не менее, я думаю, что было сказано достаточно по расплывчатому вопросу ОП, поэтому я оставлю его здесь.

Abhijit Sarkar 01.08.2023 08:14

Другие вопросы по теме