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%