Переполнение стека На этой неделе в Технической безопасности Теперь
, Поскольку я узнаю больше о программировании, которое я добавлю больше к своему списку. Добавление 43 папок теперь.
Вы можете закодировать свой хэш-код md5 с использованием base64 вместо шестнадцатеричного, таким образом вы получите более короткий URL-адрес, используя именно символы [az] [AZ] [0-9].
Есть замечательная, но древняя программа под названием btoa
, которая преобразует двоичный код в ASCII, используя прописные и строчные буквы, цифры и два дополнительных символа. Также существует кодировка MIME base64; в большинстве систем Linux, вероятно, есть программа под названием base64
или base64encode
. Любой из них даст вам короткую читаемую строку из 32-битной CRC.
Просто возьмите 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-адреса будут чувствительны к регистру. Как видите, вы по-прежнему получаете красивый аккуратный буквенно-цифровой ключ с гарантией отсутствия коллизий!
Ваша цель - создать средство сокращения 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).
Вы можете взять первые 5–10 буквенно-цифровых символов хеш-кода MD5.
Если вас не волнует криптографическая стойкость, подойдет любая из функций CRC.
Wikipedia ] перечисляет множество различных хеш-функций, включая длину вывода. Преобразование их вывода в [az] [AZ] [0-9] тривиально.
Вы можете использовать CRC32, он имеет длину 8 байт и похож на MD5. Уникальные значения будут поддерживаться путем добавления метки времени к фактическому значению.
Таким образом, он будет выглядеть как http://foo.bar/abcdefg12 .
Вы можете уменьшить количество символов из хеша 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';
}
Вы не можете использовать короткий хэш , так как вам нужно однозначное отображение короткой версии на фактическое значение. Для короткого хеша вероятность столкновения будет слишком высока. Обычные длинные хэши не очень удобны для пользователя (и даже если вероятность коллизии тогда, вероятно, будет достаточно мала, мне это все равно не кажется «правильным»)
TinyURL.com похоже, использует увеличенное число, которое преобразуется в Base 36 (0-9, AZ).
Я не думаю, что службы сокращения URL-адресов используют хеши, я думаю, что у них просто есть текущая буквенно-цифровая строка, которая увеличивается с каждым новым URL-адресом и сохраняется в базе данных. Если вам действительно нужно использовать хэш-функцию, посмотрите эту ссылку: некоторые хеш-функции Кроме того, немного оффтоп, но в зависимости от того, над чем вы работаете, это может быть интересно: Coding Horror article