2013-02-19 2 views
1

У меня есть строка, которая идентифицирует клиента. На моем веб-сайте у меня есть 3 разных изображения для клиентов, которые не установили изображение профиля. Я хочу случайным образом связать одно из этих изображений с клиентом, но не менять изображение между сеансами.Использование GetHashCode() для случайного, постоянного индекса

Есть ли проблемы с использованием GetHashCode, как в следующем коде?

switch (CustomerIdString.GetHashCode() % 3) 
{ 
    case 0: 
     return "NoProfileImage0.png"; 
     break; 

    case 1: 
     return "NoProfileImage1.png"; 
     break; 

    case 2: 
    default: 
     return "NoProfileImage2.png"; 
     break; 
} 

Я понимаю, есть и другие решения, такие как-

  • Используйте лучше хэширования библиотеки
  • Используйте идентификатор клиента в качестве семян в генераторе случайных чисел
  • Persist имя изображения против записи клиента

, но мне нравится простота (без добавленных библиотек, без кода БД) нас GetHashCode().

ответ

1

Я нашел ваш пример кода полезным в моем приложении, поскольку я делаю что-то подобное. Тем не менее, я обнаружил, что мне нужно использовать Math.abs вокруг GetHashCode как иногда возвращает отрицательные числа:

Math.Abs(String.GetHashCode()) Mod 3 

(Извиняюсь, что мой ответ находится в vb.net вместо C#)

0

Я не вижу любые проблемы с этим, хотя он не будет случайным вообще, он всегда будет одним и тем же изображением, основанным на значении для CustomerIdString.

+0

Цель состоит в том, чтобы быть случайным среди пользователей, но в соответствии для каждого пользователя. – Spongeboy

+0

Случайное не то слово, которое вы хотите; вы хотите выбрать дискретный элемент из набора, нет случайности. Я знаю, что это кажется нелепым, но ясно, что это важно в нашей отрасли. – Andy

1

Похожие: Can I depend on the values of GetHashCode() to be consistent?

В принципе, string.GetHashCode не гарантируется быть одинаковыми по всей версии платформы .NET.

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

О том, как получить MD5 хэш, см связаны: MD5 Hash From String

 Смежные вопросы

  • Нет связанных вопросов^_^