我需要将一个字符串(最大长度= 20,由随机较低的字母字符和/或数字组成)转换为一个哈希表的密钥,该哈希表最多可容纳100,000个密钥。我尝试的是将字符串中的每个字符转换为0到36之间的数字(因为每个字符有36个字符)并计算字符串的数字,计为带有基数36的位置数字系统:
long val = 0;
long v;
long pow = name.Length-1;
foreach (char c in name) {
if (char.IsNumber(c))
v = (long)c;
else
v = char.ToUpper(c) - 54;
val += v * (long)Math.Pow((double)36, (double)pow);
Console.WriteLine(v+","+pow+","+val);
pow--;
}
然后我尝试使用tolong(somestring)%100000将字符串映射到0到9999之间的键。但是,tolong函数的结果相当于很长时间甚至无法处理的大数字。
任何人都可以帮我解决如何进行此转换的权利吗?
答案 0 :(得分:0)
要坚持你的算法,你不需要计算整数,并在最后做一个mod。您可以将val更改为BigInteger
并随时修改。
BigInteger val = 0;
long v;
long pow = name.Length-1;
foreach (char c in name) {
if (char.IsNumber(c))
v = (long)c;
else
{
v = char.ToUpper(c) - 54;
val += v * (long)Math.Pow((double)36, (double)pow);
}
Console.WriteLine(v+","+pow+","+val);
pow--;
val = val % 100000;
}
答案 1 :(得分:0)
我已经实现了类似的东西(因为HashCode在机器外部无法使用)。
我开始将字符串转换为字节数组:
byte[] bytes = new byte[value.Length * sizeof(char)];
Buffer.BlockCopy(value.ToCharArray(), 0, bytes, 0, bytes.Length);
然后循环它并将其放入一个整数:
foreach (var b in bytes)
{
hash ^= RotateLeft(b, position);
position += 7;
}
RotateLeft会移位。这些细节可能有所不同。