Что лучший способ состоит в том, чтобы создать короткий хеш, подобный тому, что делает крошечный URL?

Я в настоящее время использую хеши MD5, но я хотел бы найти что-то, что создаст более короткий хеш, который использует просто [a-z][A-Z][0-9]. Это только должны быть приблизительно 5-10 символов в длину.

Есть ли что-то там, которое уже делает это?

Обновление 1:

Мне нравится хеш CRC32. Существует ли очевидный способ вычисления его в.NET?

Обновление 2:

Я использую функцию CRC32 из ссылки предоставленный Joe. Как я могу преобразовать uInt в символы, определенные выше?

43
задан simhumileco 21 October 2019 в 13:56
поделиться

10 ответов

Вы можете закодировать свой хэш-код md5 с использованием base64 вместо шестнадцатеричного, таким образом вы получите более короткий URL-адрес, используя именно символы [az] [AZ] [0-9].

0
ответ дан 26 November 2019 в 22:30
поделиться

Есть замечательная, но древняя программа под названием btoa , которая преобразует двоичный код в ASCII, используя прописные и строчные буквы, цифры и два дополнительных символа. Также существует кодировка MIME base64; в большинстве систем Linux, вероятно, есть программа под названием base64 или base64encode . Любой из них даст вам короткую читаемую строку из 32-битной CRC.

0
ответ дан 26 November 2019 в 22:30
поделиться

Просто возьмите Base36 (без учета регистра) или Base64 идентификатора записи.

Итак, допустим, я хотел использовать Base36:

(ID - Base36)
1–1
2–2
3–3
10 - А
11 - B
12 - C
...
10000 - 7PS
22000 - GZ4
34000 - Q8C
...
1000000 - LFLS
2345000 - 1E9EW
6000000 - 3KLMO

Вы могли бы сделать их еще короче, если бы выбрали base64, но тогда URL-адреса будут чувствительны к регистру. Как видите, вы по-прежнему получаете красивый аккуратный буквенно-цифровой ключ с гарантией отсутствия коллизий!

12
ответ дан 26 November 2019 в 22:30
поделиться

Ваша цель - создать средство сокращения URL-адресов или хэш-функцию?

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

Вы можете сделать это, используя такой код:

using System.Security.Cryptography;

const int numberOfNumbersNeeded = 100;
const int numberOfBytesNeeded = 8;
var randomGen = RandomNumberGenerator.Create();
for (int i = 0; i < numberOfNumbersNeeded; ++i)
{
     var bytes = new Byte[numberOfBytesNeeded];
     randomGen.GetBytes(bytes);
}

Использование криптографического генератор чисел затруднит предсказание генерируемых вами строк, что, как я полагаю, важно для вас.

Затем вы можете преобразовать 8-байтовое случайное число в строку, используя символы в вашем алфавите. По сути, это изменение базового расчета (с 256 на 62).

35
ответ дан 26 November 2019 в 22:30
поделиться

Вы можете взять первые 5–10 буквенно-цифровых символов хеш-кода MD5.

-1
ответ дан 26 November 2019 в 22:30
поделиться

Если вас не волнует криптографическая стойкость, подойдет любая из функций CRC.

Wikipedia ] перечисляет множество различных хеш-функций, включая длину вывода. Преобразование их вывода в [az] [AZ] [0-9] тривиально.

0
ответ дан 26 November 2019 в 22:30
поделиться

Вы можете использовать CRC32, он имеет длину 8 байт и похож на MD5. Уникальные значения будут поддерживаться путем добавления метки времени к фактическому значению.

Таким образом, он будет выглядеть как http://foo.bar/abcdefg12 .

2
ответ дан 26 November 2019 в 22:30
поделиться

Вы можете уменьшить количество символов из хеша MD5 путем кодирования их как буквенно-цифровые. Каждый символ MD5 обычно представлен в шестнадцатеричном формате, так что это 16 возможных значений. [a-zA-Z0-9] включает 62 возможных значения, поэтому вы можете закодировать каждое значение, взяв 4 значения MD5.

РЕДАКТИРОВАТЬ:

вот функция, которая принимает число (4 шестнадцатеричных цифры) и возвращает [ 0-9a-zA-Z]. Это должно дать вам представление о том, как это реализовать. Обратите внимание, что могут быть некоторые проблемы с типами; Я не тестировал этот код.

char num2char( unsigned int x ){
    if( x < 26 ) return (char)('a' + (int)x);
    if( x < 52 ) return (char)('A' + (int)x - 26);
    if( x < 62 ) return (char)('0' + (int)x - 52);
    if( x == 62 ) return '0';
    if( x == 63 ) return '1';
}
3
ответ дан 26 November 2019 в 22:30
поделиться

Вы не можете использовать короткий хэш , так как вам нужно однозначное отображение короткой версии на фактическое значение. Для короткого хеша вероятность столкновения будет слишком высока. Обычные длинные хэши не очень удобны для пользователя (и даже если вероятность коллизии тогда, вероятно, будет достаточно мала, мне это все равно не кажется «правильным»)

TinyURL.com похоже, использует увеличенное число, которое преобразуется в Base 36 (0-9, AZ).

7
ответ дан 26 November 2019 в 22:30
поделиться

Я не думаю, что службы сокращения URL-адресов используют хеши, я думаю, что у них просто есть текущая буквенно-цифровая строка, которая увеличивается с каждым новым URL-адресом и сохраняется в базе данных. Если вам действительно нужно использовать хэш-функцию, посмотрите эту ссылку: некоторые хеш-функции Кроме того, немного оффтоп, но в зависимости от того, над чем вы работаете, это может быть интересно: Coding Horror article

16
ответ дан 26 November 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: