String.GetHashCode()的值范围是什么?
对于长度不同的随机字符串,它们的哈希码值范围是否不同?
e.g。
有2组随机字符串。第1组字符串的长度为5.第2组字符串的长度为10.这两个组的哈希码值范围是否相同?
我的问题场景是:
我有一个输入方法作为一些固定长度的随机GUID字符串。我需要以固定的百分比选择一组固定的(但不是预定义的)。我正在考虑将字符串哈希码值范围划分为10个段,并选择其哈希值落入第一个段的字符串。因此,我得到了所有输入字符串的固定10%。
输入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%
答案 0 :(得分:2)
这是一个明确的"XY Problem"式问题。
如果要选择给出的GUID的10%,为什么不在[0,1]范围内生成随机数,如果数字小于0.1,则选择GUID。
将您选择的GUID保留在列表中,如果它再次提供并位于列表中,则会再次选择它(如果我理解&#34;如果之前选择了一个字符串,它们将会总是被选中&#34;要求)。