Asp.net 对随机持久索引使用GetHashCode()
我有一个识别客户的字符串。在我的网站上,我为没有设置个人资料图片的客户提供了3张不同的图片。我想随机将这些图像中的一个与客户关联,但不会在会话之间更改图像 使用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
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哈希的信息,请参阅相关内容:目的是让它在用户之间随机,但对每个用户都是一致的;如果要从集合中选择一个离散项,则不涉及随机性。我知道这似乎是吹毛求疵,但在我们的行业中,清楚这类事情很重要。