如何将字符串转换为哈希表的键

本文关键字:哈希表 转换 字符串 | 更新日期: 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进行位移位。这些细节可能会有所不同