Вот как использовать 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
В .NET есть множество провайдеров хэш-сумм, которые создают криптографические хеш-коды, что удовлетворяет вашему условию, что они уникальны (для большинства целей защищена от коллизий). Все они чрезвычайно быстро, и хэширование определенно не станет узким местом в вашем приложении, если вы не сделаете это триллион раз.
Лично мне нравится SHA1:
string hash;
using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
}
Даже когда люди говорят, что один метод может быть медленнее другого, это все в относительном выражении. Программа, работающая с изображениями, определенно не заметит микросекундный процесс генерации хэш-суммы.
И в отношении коллизий, для большинства целей это также не имеет значения. Даже «устаревшие» методы, такие как MD5, все еще очень полезны в большинстве ситуаций.
Часть ответа Рекса М об использовании SHA1 для генерации хэша является хорошей (MD5 также является популярным вариантом). Предложение Зволкова о том, что не следует постоянно создавать новых поставщиков криптографии, также является хорошим (как и предложение об использовании CRC, если скорость важнее, чем фактически гарантированная уникальность.
Однако, не не используйте Encoding.UTF8.GetString () для преобразования байта [] в строку (если, конечно, из контекста не известно, что это допустимый UTF8). Например, он отклонит недопустимые суррогаты . метод гарантированно всегда даст вам правильную строку из байта []: Convert.ToBase64String () .
Создание нового экземпляра SHA1CryptoServiceProvider каждый раз, когда вам нужно вычислить хеш, НЕ является быстрым вообще. Использовать тот же экземпляр довольно быстро.
Тем не менее, я бы предпочел использовать один из многих алгоритмов CRC вместо криптографического хэша, так как хеш-функции, предназначенные для криптографии, не работают слишком хорошо для очень маленьких размеров хэша (32 бита), это то, что вы хотите для переопределения GetHash () (при условии, что это то, что вы хотите).
Проверьте эту ссылку для одного примера вычисления CRC в C #: http://sanity-free.org/134/standard_crc_16_in_csharp.html
PS причина, по которой вы хотите, чтобы ваш хеш был маленьким (16 или 32 бита), так что вы можете сравнить их БЫСТРО (в этом весь смысл хэшей, помните?).
Вы можете использовать любой из стандартных алгоритмов хеширования, но хеширование технически не может гарантировать уникальность. Хеширование предназначено для того, чтобы быть относительно быстрым и / или небольшим токеном, чтобы можно было увидеть, совпадает ли одна часть данных с другой. Вполне возможно, что совершенно разные наборы данных могут генерировать один и тот же хеш, хотя возможность генерировать их алгоритмически очень сложно.
Помимо всего этого, для проверки вероятной идентичности, MD5 довольно быстр. SHA более надежен (MD5 взломан, поэтому его не следует использовать в целях безопасности), но он также медленнее.