【问题标题】:What's the value range of String.GetHashCode?String.GetHashCode 的取值范围是多少?
【发布时间】:2023-03-25 23:06:01
【问题描述】:

String.GetHashCode()的取值范围是多少?

对于不同长度的随机字符串,它们的哈希码取值范围是否不同?

例如

有 2 组随机字符串。第 1 组字符串的长度为 5。第 2 组的字符串长度为 10。这 2 组的哈希码值范围是否相同?

更新 1

我的问题场景是:

我有一个输入为一些固定长度的随机 GUID 字符串的方法。我需要以固定的百分比选择一组固定的(但不是预定义的)。我正在考虑将字符串哈希码值范围划分为 10 段,并选择哈希值落入第一段的字符串。因此,我得到了所有输入字符串的固定 10%。

更新 2

输入的 GUID 字符串未在列表中给出。它们是一一给出的。并且可以有重复的。我永远不会知道他们有多少。我只需要确定总体百分比。如果一个字符串之前被选中,它们将永远被选中。

下面是我的实验:

static void Main(string[] args)
{
    double min = int.MaxValue / 100.0 * 15.0;
    double max = int.MaxValue / 100.0 * 25.0;
    double total = 0;
    double picked = 0;
    Console.WriteLine("range ratio: {0:f4}%", (max - min) / int.MaxValue * 100);

    for (int i = 0; i < 500000; i++)
    {
        string mcid = Guid.NewGuid().ToString();
        int hash = mcid.GetHashCode();
        total++;
        if (hash >= min && hash <= max)
        {
            picked++;
        }
        Console.Write("\rPicked: {0:f4}, Total {1:f4}, Ratio: {2:f4}%", picked, total, picked / total * 100.0);
    }
}

我多次运行代码,输出有点奇怪。 选取的 GUID 的比例总是范围比例的一半。 如果是这样。我想我可以使用双倍大小的范围。

例如:

射程比:10.0000%

选中:25028.0000,总计 500000.0000,比例: 5.0056%

【问题讨论】:

  • 顺便问一下,你是想解决这个问题的问题吗?
  • 那么,您想从字符串列表中随机选择 10% 的集合吗?我不会使用散列,只是随机播放并占据顶部(list.Length / 10) - 请参阅stackoverflow.com/questions/48087/…
  • 这些是 v4(随机)GUID 吗?您可以简单地使用 guid 中的一部分随机位来存储它们,而不是通过 String.GetHashCode。
  • 我不能使用随机播放方法。因为 GUID 字符串没有在列表中给出。

标签: .net hash string-hashing


【解决方案1】:

这是一个明确的"XY Problem" 风格问题。

如果您想选择给定的 GUID 的 10%,为什么不在 [0,1) 范围内生成一个随机数,如果该数字小于 0.1,则选择 GUID。

将您选择的 GUID 保留在列表中,如果再次提供并在列表中,则再次选择它(如果我理解“如果之前选择了字符串,则将始终选择它们”的要求)。

【讨论】:

  • 我的场景是 Web 应用程序解决方案的一部分。 GUID 用于表示客户端。我的目的是将一组 fixed 客户端路由到测试环境(因此它不是传统的流量操纵)。由于客户端数量众多,我无法将 GUID 保存在列表中。我需要一种就地解决方案。
  • 我明白了 - 我认为如果您使用自己的哈希函数,您可以控制分布(并通过测试验证),您可以使用该哈希来确定性地选择 GUID 是在一组还是另一组(本质上,这就是哈希表中应该做的事情:或多或少地将项目均匀地分配到存储桶中)。但是,我认为我会使用自己的哈希函数而不是框架中的哈希函数,以确保使用的函数具有我想要的特性。
  • +1。这。网络哈希函数可能随时变化。你不应该依赖它的内部结构。
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 2014-12-02
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多