Проблема с вашим вопросом в том, что вход больше, чем выход и уникальный. Если вы ожидаете уникального результата, этого не произойдет. Причина этого в том, что если у вас есть входное пространство из 22 числовых цифр (10^22 возможностей) и выходное пространство шестнадцатеричных цифр с длиной 11 цифр (возможности 16^11), вы получаете больше возможностей ввода, чем возможности вывода.
На следующем рисунке показано, что вам понадобится выходное пространство из 19 шестнадцатеричных цифр и идеальная взаимно-однозначная функция, иначе у вас будут столкновения довольно часто (более 50% времени). Я предполагаю, что это то, чего вы не хотите, но вы не указали.
Так что вы хотите не может быть сделано, я хотел бы предложить пересматривают свой дизайн или с помощью контрольной суммы, такие как cyclic redundancy check (CRC). CRC-64 будет выдавать 64-битный вывод и при кодировании любым алгоритмом base64 даст вам что-то в соответствии с тем, что вы хотите. Это не обеспечивает криптографической силы, такой как SHA-1, поэтому ее никогда нельзя использовать ни в чем, связанном с информационной безопасностью.
Однако, если бы вы смогли изменить свои критерии, чтобы использовать длинные хеш-выходы, то я настоятельно рекомендую вам посмотреть на SHA-512, так как это обеспечит высококачественные выходы с крайне низкой вероятностью дублирования. По низкой вероятности я имею в виду, что ни один из двух входов еще не найден равным одному и тому же хэшу в истории алгоритма.
Если оба этих предложения по-прежнему не очень хороши для вас, то ваша последняя альтернатива, вероятно, будет состоять только из base64 на входных данных. Он будет по существу использовать стандартный английский алфавит наилучшим образом, чтобы представлять ваши данные, тем самым уменьшая количество символов как можно больше, сохраняя при этом полное представление входных данных. Это не хеш-функция, а просто метод кодирования двоичных данных.
Хеш по определению не будет уникальным.Представьте себе: «Если я дам вам 8 уникальных чисел от 1 до 10, дай мне 8 уникальных хэшей между 1 и 5». Это абсолютно невозможно. – Servy
Keerl имеет 12 символов хэша для работы, поэтому он * может * вставить 4.7^21 уникальных записей. Я бы сказал, что это для всех целей и целей достаточно разумное ожидание. – eouw0o83hf
Хэш, по определению, приводит к меньшим возможностям/вариантам, чем исходное значение unhashed. Если бы этого не произошло, не было бы никакой причины хешировать его. – Servy