1

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%

4

1 回答 1

2

这是一个明确的“XY 问题”风格的问题。

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

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

于 2014-08-27T05:23:03.813 回答