如何将字符串转换为哈希表的键
本文关键字:哈希表 转换 字符串 | 更新日期: 2023-09-27 17:54:38
我需要转换一个字符串(max。长度= 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函数的结果是long甚至无法处理的巨大数字。
有谁能告诉我如何才能正确地进行这种转换吗?
要坚持你的算法,你不需要计算整个数字并在最后做一个mod。您可以将val更改为BigInteger
并随您的需要更改mod。
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;
}
我已经实现了这样的东西(因为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进行位移位。这些细节可能会有所不同