Рейтинг:1

Функция хеширования: создание уникального трехбуквенного идентификатора.

флаг cn

Мне нужно создать функцию генерации идентификатора, которая принимает 4-значное число и возвращает уникальный 3-буквенный идентификатор.

У меня уже есть функция, которая генерирует двухбуквенный идентификатор из трехзначного числа с некоторыми ограничениями (от 100 до 775), но я не знаю, как изменить ее, чтобы она соответствовала новым требованиям.

если order_id < 775:
  алфавит = список('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
  альфа_индекс = ''
  _i_1 = 0
  _i_2 = 0
  если order_id >=100 и order_id < 775:
    приращение = 4*int((order_id-100)/100)
    _mod_100 = идентификатор_заказа%100
    если _mod_100 > 25:
      _i_1 = (_mod_100/25)+приращение
      _i_2 = _mod_100%25
      alpha_index += алфавит[int(_i_1-1)]
      alpha_index += алфавит[int(_i_2-1)]
    еще:
      индекс = строка (идентификатор_заказа) [1] + строка (идентификатор_заказа) [2]
      индекс = интервал (индекс)
      если приращение:
        alpha_index = алфавит[приращение-1]
      alpha_index += алфавит[индекс] 
    alpha_order_id = alpha_index+str(order_id)[3:]
еще:
  alpha_order_id = заказ_id

Любая помощь приветствуется.

kelalaka avatar
флаг in
26$^3 = 17576 > 9999$. просто умножить на $x$ взять мод 17576?
fgrieu avatar
флаг ng
Это элементарный вопрос программирования, не имеющий отношения к криптографии.
Paul Uszak avatar
флаг cn
@fgrieu Совсем не актуально? Ничего такого? Хэширование - нет? Уникальность ответа - нет? Введение в криптографические хэши (решение) - нет? Универсальное хеширование - нет? Это не способ увеличить базу пользователей fgrieu.
Majed Badawi avatar
флаг cn
@fgrieu Я не уверен, что в этом элементарного и почему это было помечено как «не по теме». У меня нет опыта в криптографии, и я надеялся получить помощь. Я четко объяснил проблему и показал попытку. Пожалуйста, посоветуйте, где задать этот вопрос, если это место не подходит для него (DBA, SO...)
fgrieu avatar
флаг ng
Заданный вопрос не о криптографии: единственное упоминание о хеше есть в заголовке, а не в постановке задачи. Речь идет об изменении основы счисления: с 4 цифр по основанию 10 на 3 цифры|символа по основанию 26. Изменение основы — это элементарная математика/информатика, а не криптография. Подсказка: по причине, указанной в первом комментарии, любая комбинация из 4 цифр в базе 10 может быть выражена как 3 цифры|символы в базе 26.
Majed Badawi avatar
флаг cn
@fgrieu, как следует генерировать третью букву в приведенном выше решении, чтобы каждый раз гарантировать уникальный вывод из 4-значного числа? Я ищу способ изменить вышеуказанное решение, чтобы поддержать это. Приветствуются любые другие подсказки или алгоритмы исследования.
fgrieu avatar
флаг ng
Я приведу пример и позволю вам написать код (который я предлагаю вам сделать с нуля). Допустим, вы хотите преобразовать 9876 в 3 цифры|символа по основанию 26. Мы вычисляем 9796%26=22, закодированное символом `W`. Осталось закодировать 9796//26=379.Мы вычисляем 379%26=15, закодированное символом `P`. Осталось закодировать 379//26=14 (мы знаем, что результат меньше 26 по причине, которую kelalaka указал в комментарии), закодированное символом `O`. Часто при изменении базы мы пишем результат первым полученным символом справа: `OPW`. Опять же, это базовое изменение или кодирование.
Paul Uszak avatar
флаг cn
Вместо вашего кода, как насчет криптографической хэш-функции, например. SHA-х/MD5? Итак, `H(input) >> n`, где n — подходящее количество прав сдвига для получения 3 символов. Поскольку вы переходите от 4 к 3, посмотрите принцип Pigeon Hole и что такое сюръекция. И разница между простой хэш-функцией, такой как hashCode в Java, и криптографической.

Ответить или комментировать

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