Asp.net 对随机持久索引使用GetHashCode()

Asp.net 对随机持久索引使用GetHashCode(),asp.net,.net,gethashcode,Asp.net,.net,Gethashcode,我有一个识别客户的字符串。在我的网站上,我为没有设置个人资料图片的客户提供了3张不同的图片。我想随机将这些图像中的一个与客户关联,但不会在会话之间更改图像 使用GetHashCode是否有任何问题,如下面的代码 switch (CustomerIdString.GetHashCode() % 3) { case 0: return "NoProfileImage0.png"; break; case 1: return "NoPr

我有一个识别客户的字符串。在我的网站上,我为没有设置个人资料图片的客户提供了3张不同的图片。我想随机将这些图像中的一个与客户关联,但不会在会话之间更改图像

使用GetHashCode是否有任何问题,如下面的代码

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

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

    case 2:
    default:
        return "NoProfileImage2.png";
        break;
}
我知道还有其他解决方案,例如-

  • 使用更好的哈希库
  • 将客户id用作随机数生成器中的种子
  • 根据客户记录保留映像名称

但是我喜欢使用GetHashCode()的简单性(没有添加库,没有DB代码)。

我发现您的示例代码在我的应用程序中很有用,因为我正在做类似的事情。但是,我发现我需要在GetHashCode中使用Math.Abs,因为它有时返回负数:

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

(很抱歉,我的答复是用vb.net而不是c#)我看不出有任何问题,尽管它不是随机的,但基于与
CustomerIdString
相关的值,它始终是相同的图像:

基本上,
string.GetHashCode
不能保证在.NET framework的各个版本中是相同的

您可能想考虑使用在.NET之外更广泛的范围内的哈希函数(但仍然在.NET中实现),并有一个关联的规范,例如MD5。这将使您的软件更具可移植性和弹性


有关如何获取MD5哈希的信息,请参阅相关内容:

目的是让它在用户之间随机,但对每个用户都是一致的;如果要从集合中选择一个离散项,则不涉及随机性。我知道这似乎是吹毛求疵,但在我们的行业中,清楚这类事情很重要。