C# Создают хеш для массива байтов или отображают [копируют]

Вот как использовать match (основываясь на MCVE, предложенном Морисом:

 grades <- paste0(rep(LETTERS[c(1:4,6)], each = 3), c("+", "", "-"))[-c( 13)] # keep A+
 PollsFiltered$nums <- match(PollsFiltered$grade, rev(grades) ) # F(1) to A+(14)

> head(PollsFiltered)
  grade nums
1     B   10
2    C+    8
3    A+   14
4    A-   12
5    C+    8
6     B   10
36
задан Community 23 May 2017 в 12:25
поделиться

4 ответа

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

Лично мне нравится SHA1:

string hash;
using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
    hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
}

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

И в отношении коллизий, для большинства целей это также не имеет значения. Даже «устаревшие» методы, такие как MD5, все еще очень полезны в большинстве ситуаций.

60
ответ дан 27 November 2019 в 05:34
поделиться

Часть ответа Рекса М об использовании SHA1 для генерации хэша является хорошей (MD5 также является популярным вариантом). Предложение Зволкова о том, что не следует постоянно создавать новых поставщиков криптографии, также является хорошим (как и предложение об использовании CRC, если скорость важнее, чем фактически гарантированная уникальность.

Однако, не не используйте Encoding.UTF8.GetString () для преобразования байта [] в строку (если, конечно, из контекста не известно, что это допустимый UTF8). Например, он отклонит недопустимые суррогаты . метод гарантированно всегда даст вам правильную строку из байта []: Convert.ToBase64String () .

15
ответ дан 27 November 2019 в 05:34
поделиться

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

Тем не менее, я бы предпочел использовать один из многих алгоритмов CRC вместо криптографического хэша, так как хеш-функции, предназначенные для криптографии, не работают слишком хорошо для очень маленьких размеров хэша (32 бита), это то, что вы хотите для переопределения GetHash () (при условии, что это то, что вы хотите).

Проверьте эту ссылку для одного примера вычисления CRC в C #: http://sanity-free.org/134/standard_crc_16_in_csharp.html

PS причина, по которой вы хотите, чтобы ваш хеш был маленьким (16 или 32 бита), так что вы можете сравнить их БЫСТРО (в этом весь смысл хэшей, помните?).

5
ответ дан 27 November 2019 в 05:34
поделиться

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

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

3
ответ дан 27 November 2019 в 05:34
поделиться
Другие вопросы по тегам:

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