1

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

4

3 回答 3

1

相关:我可以依赖 GetHashCode() 的值来保持一致吗?

基本上,string.GetHashCode不保证跨 .NET 框架的版本相同。

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

有关如何获取 MD5 哈希,请参阅相关:MD5 Hash From String

于 2013-05-28T19:34:41.597 回答
1

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

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

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

于 2013-05-28T19:00:19.143 回答
0

我看不出有任何问题,尽管它根本不是随机的,但它始终是基于CustomerIdString.

于 2013-05-28T19:29:59.253 回答