【发布时间】: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