2012-04-18 2 views
0

Мне нужно записать число (около 22 цифр), а длина результата должна быть меньше 12 символов. Это может быть число или сочетание символов и должно быть уникальным. (Количество введенных номеров также будет уникальным).Функция хэша для получения результата ограниченной длины

Например, если введенный номер 000000000000000000001, результат должен быть чем-то вроде 2s5As5A62s.

Я смотрел типичные, как MD5, SHA-1 и т. Д., Но они дают большие результаты.

+3

Хеш по определению не будет уникальным.Представьте себе: «Если я дам вам 8 уникальных чисел от 1 до 10, дай мне 8 уникальных хэшей между 1 и 5». Это абсолютно невозможно. – Servy

+0

Keerl имеет 12 символов хэша для работы, поэтому он * может * вставить 4.7^21 уникальных записей. Я бы сказал, что это для всех целей и целей достаточно разумное ожидание. – eouw0o83hf

+1

Хэш, по определению, приводит к меньшим возможностям/вариантам, чем исходное значение unhashed. Если бы этого не произошло, не было бы никакой причины хешировать его. – Servy

ответ

0

Почему бы не взять MD5 или SHA-N, а затем рефакторинг на BASE64 (или базу-что угодно) и взять только 12 символов из них? NB: во всех случаях хэш никогда не будет уникальным (но может обеспечить низкую вероятность столкновения)

0

Вы не можете использовать хэш, если он должен быть уникальным.

Для хранения такого количества требуется около 74 бит. Если вы преобразуете его в base-64, то это будет около 12 символов.

+1

Для всех практических целей любой алгоритм SHA-2 будет предлагать уникальный выход для большей части входного пространства. Хотя математически верно, что алгоритмы SHA-2 не будут охватывать все его пространство вывода, ни одно из алгоритмов не найдено ни одного столкновения. –

+0

На самом деле вам нужно 76,4 бит для хранения десятизначного числа из 22 цифр. log2 (10E22 - 1) = 76.4 –

+0

@ MichaelJ.Gray: Это нормально, если достаточно * почти * уникального. Если он должен быть абсолютно уникальным, он недостаточно хорош. Столкновения существуют, так что это всего лишь вопрос, сколько времени потребуется, чтобы найти его. – Guffa

-1

Можете ли вы подробнее рассказать о своем требовании для хеширования? Вам нужно убедиться, что результат разнообразен? (т. е. не 1 = a, 2 = b)

Просто подумайте вслух и немного в поперечном направлении, но не могли бы вы применить принципы кодирования длины во время вашего номера, рассматривая его как данные, которые вы хотите сжать. Затем вы можете использовать версию base64 для вашей сжатой версии.

+0

Если входы случайны, RLE не будет работать. Кроме того, выход RLE будет меняться со временем, а длина увеличится с более уникальными входами, если они неслучайны, но последовательны. –

6

Проблема с вашим вопросом в том, что вход больше, чем выход и уникальный. Если вы ожидаете уникального результата, этого не произойдет. Причина этого в том, что если у вас есть входное пространство из 22 числовых цифр (10^22 возможностей) и выходное пространство шестнадцатеричных цифр с длиной 11 цифр (возможности 16^11), вы получаете больше возможностей ввода, чем возможности вывода.

На следующем рисунке показано, что вам понадобится выходное пространство из 19 шестнадцатеричных цифр и идеальная взаимно-однозначная функция, иначе у вас будут столкновения довольно часто (более 50% времени). Я предполагаю, что это то, чего вы не хотите, но вы не указали.

enter image description here

Так что вы хотите не может быть сделано, я хотел бы предложить пересматривают свой дизайн или с помощью контрольной суммы, такие как cyclic redundancy check (CRC). CRC-64 будет выдавать 64-битный вывод и при кодировании любым алгоритмом base64 даст вам что-то в соответствии с тем, что вы хотите. Это не обеспечивает криптографической силы, такой как SHA-1, поэтому ее никогда нельзя использовать ни в чем, связанном с информационной безопасностью.

Однако, если бы вы смогли изменить свои критерии, чтобы использовать длинные хеш-выходы, то я настоятельно рекомендую вам посмотреть на SHA-512, так как это обеспечит высококачественные выходы с крайне низкой вероятностью дублирования. По низкой вероятности я имею в виду, что ни один из двух входов еще не найден равным одному и тому же хэшу в истории алгоритма.

Если оба этих предложения по-прежнему не очень хороши для вас, то ваша последняя альтернатива, вероятно, будет состоять только из base64 на входных данных. Он будет по существу использовать стандартный английский алфавит наилучшим образом, чтобы представлять ваши данные, тем самым уменьшая количество символов как можно больше, сохраняя при этом полное представление входных данных. Это не хеш-функция, а просто метод кодирования двоичных данных.

+0

круто! «С небольшим шансом я имею в виду, что ни один из двух входов пока не найден равным одному и тому же хэшу в истории алгоритма», –

Смежные вопросы