String.GetHashCode的值范围是什么?

时间:2014-08-27 03:25:19

标签: .net hash string-hashing

String.GetHashCode()的值范围是什么?

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

e.g。

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

更新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%

1 个答案:

答案 0 :(得分:2)

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

如果要选择给出的GUID的10%,为什么不在[0,1]范围内生成随机数,如果数字小于0.1,则选择GUID。

将您选择的GUID保留在列表中,如果它再次提供并位于列表中,则会再次选择它(如果我理解&#34;如果之前选择了一个字符串,它们将会总是被选中&#34;要求)。