【问题标题】:Using GetHashCode() for a random, persistent index将 GetHashCode() 用于随机的持久索引
【发布时间】:2013-02-19 01:53:52
【问题描述】:

我有一个标识客户的字符串。在我的网站上,我为未设置个人资料图片的客户提供了 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 代码)。

【问题讨论】:

    标签: asp.net .net gethashcode


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      基本上,string.GetHashCode 不保证在 .NET 框架的各个版本中都是相同的。

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

      获取MD5哈希的方法见相关:MD5 Hash From String

      【讨论】:

        【解决方案3】:

        我认为这没有任何问题,尽管它根本不是随机的,但它始终是基于 CustomerIdString 的值的相同图像。

        【讨论】:

        • 目标是在用户中随机,但对每个用户都是一致的。
        • 随机不是你想要的词;你想从一组中选择一个离散的项目,不涉及随机性。我知道这似乎很挑剔,但弄清楚这类事情在我们的行业中很重要。
        猜你喜欢
        • 2012-07-10
        • 2013-04-17
        • 2014-10-23
        • 2013-12-21
        • 1970-01-01
        • 1970-01-01
        • 2018-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多