C#: Как сгенерировать короткий код MD5?

  • Первый удостоверяются, что Вашей базой данных является довольно здоровый, выполненный DBCC DBREINDEX на нем, если это возможно, DBCC INDEXDEFRAG и статистика обновления, если Вы не можете позволить себе хит производительности.

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

  • Теперь, когда у Вас есть свои самые долгие рабочие запросы, настройте сопли из них; получите тех, которые обнаруживаются больше всего, смотрят на планы выполнения в Query Analyzer, не торопитесь для понимания их, добавьте индексы в случае необходимости для ускорения извлечения

  • взгляд на создание покрытых индексов; измените приложение в случае необходимости, если оно делает ВЫБОР * ОТ..., когда оно только должно ВЫБРАТЬ LASTNAME, FIRSTNAME....

  • Повторение профилировщик, выбирающий, с продолжительностью 5 секунд, 3 секунд, и т.д. пока, производительность не оправдывает Ваши надежды.

21
задан Rasmus Faber 10 August 2009 в 10:19
поделиться

6 ответов

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

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

После получения хеша MD5 из вызова MD5.ComputeHash вы можете использовать кодировщик ASCII85 Джеффа Атвуда :

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 . Кодировщик .

30
ответ дан 29 November 2019 в 06:42
поделиться

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

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

10
ответ дан 29 November 2019 в 06:42
поделиться

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

Другие хештипы меньшего размера (взяты из Википедии)

Хеш-функция Фаулера-Нолла-Во (32, 64, 128, 256, 512 или 1024 бит)
Хеш-функция Дженкинса (32 бита)
MurmurHash (32 или 64 бит)
Хеширование Пирсона (8 бит)

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

7
ответ дан 29 November 2019 в 06:42
поделиться

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

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

3
ответ дан 29 November 2019 в 06:42
поделиться

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

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

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

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

23 кодируется как «gmuyaiyyyyy» . (63498398 выбрано честным броском в кости.)

4
ответ дан 29 November 2019 в 06:42
поделиться

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

1
ответ дан 29 November 2019 в 06:42
поделиться
Другие вопросы по тегам:

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