将GetHashCode()用于随机持久索引

时间:2013-02-19 01:53:53

标签: asp.net gethashcode

我有一个标识客户的字符串。在我的网站上,我为没有设置个人资料图片的客户提供了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()的简单性(没有添加库,没有数据库代码)。

3 个答案:

答案 0 :(得分:1)

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

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

(道歉,我的回复是在vb.net而不是c#)

答案 1 :(得分:1)

相关:Can I depend on the values of GetHashCode() to be consistent?

基本上,不能保证string.GetHashCode在.NET框架版本中保持相同。

您可能需要考虑使用存在于.NET之外的更广泛范围内的哈希函数(但仍在.NET中实现!)并且具有相关的规范,例如MD5。这将使您的软件更具便携性和弹性。

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

答案 2 :(得分:0)

我没有看到任何问题,虽然它根本不是随机的,但它将始终是基于CustomerIdString的值的相同图像。