Подтвердить что ты не робот

С#: Как создать короткий код MD5?

Когда я шифрую 23 с помощью MD5-шифрования, я получаю 37693cfc748049e45d87b8c7d8b9aacd эту длинную строку длиной 32 символа, которая всегда будет статичной для 23.

Я хочу такой же механизм, но вместо этого должен генерировать 18 или менее (например: 122ff1e4883358b6) символов длиной 32.

Как я могу это сделать в С#, есть ли более короткая версия MD5 в С#??

4b9b3361

Ответ 1

Мне нравится @RichieHindle ответ. Однако, если вам интересно потерять меньше бит точности (и тем самым уменьшить риск столкновений), вы можете взять 128-битное значение, возвращаемое хешей MD5, и закодировать его с помощью ASCII85 (также известный как кодировка Base85) вместо кодировки с шестнадцатеричным кодированием. Это даст вам весь хеш в 20 байтах (это больше, чем вы хотели, но вы могли бы отрубить 2 байта, что привело к гораздо меньшим потерям, чем удаление 14 из 32 байтов, которые вы получили бы с помощью шестнадцатеричной кодировки).

Изменить: Prashant говорит, что 20 символов достаточно близко, и попросил пример кода:

После получения MD5-хэша из вызова MD5.ComputeHash вы можете использовать Jeff Atwood ASCII85 encoder:

MD5 m = MD5.Create();
byte[] hash = m.ComputeHash(System.Text.Encoding.ASCII.GetBytes("23"));
Ascii85 encoder = new Ascii85();
encoder.EnforceMarks = false;
string hash85 = encoder.Encode(hash);
Console.Out.WriteLine(hash85);

Урожайность

2ebDPFFZsD?&,r1fX\$,

чтобы вы могли просто использовать hash85. encoder.EnforceMarks гарантирует, что кодировка не включает некоторые типичные префикс и суффиксы, связанные с ASCII85.

Ответ 2

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

(Если вы делаете это по соображениям безопасности, помните, что меньшее количество бит делает хэши легче взломать, независимо от алгоритма. Даже вне приложений безопасности меньшее количество бит увеличивает риск столкновений. Также имейте в виду, что MD5 относительная ненадежность в наши дни - SHA-1 или SHA-2 считаются более безопасными.)

Ответ 3

MD5 всегда создает 128-битный хэш.

Другие более мелкие хэштипы (взяты из Википедии)

Функция хэша Fowler-Noll-Vo (32, 64, 128, 256, 512 или 1024 бит)
Функция хэша Jenkins (32 бит)
MurmurHash (32 или 64 бит)
Хеширование Pearson (8 бит)

Но помните хеш-коллизии

Ответ 4

Использовать FVNHash - http://www.codeproject.com/KB/security/FnvHash.aspx

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

Ответ 5

Я бы не использовал хэш-функцию, если вы хотите, чтобы вернуть результат обратно к исходному значению без коллизий.

Если ваша цель состоит в том, чтобы превратить небольшое десятичное число в длинную запутанную строку, просто придумайте какой-то алгоритм сопоставления и закодируйте результат с помощью zBase32 или аналогичный.

public string Obfuscate(long x)
{
    return ToZBase32(BitConverter.GetBytes(x * 63498398L));
}

public long Deobfuscate(string x)
{
    return BitConverter.ToInt64(FromZBase32(x)) / 63498398L;
}

23 получает кодировку "gmuyaiayyyyyy". (63498398, выбранный броском кубиков).

Ответ 6

Самый короткий полезный алгоритм хэширования будет md5. генерирует 16 байтов = 128 бит хэша. если вы используете кодировку base 64..., которая является 6 полезными битами в байт / char.

u должен иметь возможность уменьшить md5 до 22 символов (ascii). у вас есть hex-версия, где 2 байта представляют один фактический байт

(оставляя завершающее дополнение, введенное b64)

с дополнительным преимуществом использования этого же для юридических имен файлов. (из-за того, что u будет заменять символы по умолчанию/и + любым другим символом, который не сталкивается с соглашением об именах файлов ваших os.

base64 (путем замены/и +) гарантирует, что ваш хэш не испортит URL со специальными символами, что может означать что-то еще на вашем веб-сервере

ASCII85 добавляет символы, с которыми трудно справиться при использовании в качестве имен файлов и в URL-адресах

md5 ('Эта строка будет хеширована')

'37aa3296c523f6c5a7fd2102a9155dcc' (hex) (32 байта)

raw md5 ('Эта строка будет хеширована')

[55, 170, 50, 150, 197, 35, 246, 197, 167, 253, 33, 2, 169, 21, 93, 204] = (16 байт)

base64 строки raw md5

N6oylsUj9sWn_SECqRVdzA ==

My Final Hash

N6oylsUj9sWn_SECqRVdzA, это на самом деле полный md5 в 22 символах ascii

([вы можете разделить два трейлинга = всегда будет два для md5 - добавьте их позже при декодировании, а также замените + и/символы в b64 на любые другие, которые я предпочитаю - (тире) и _ (подчеркивание)]

Ответ 7

эта длинная строка длиной 32 символа является числом из шестнадцатеричного числа: 0-f вы можете сделать это короче, переведя его шестнадцатеричное значение в радиус 36: 0-z