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

时间:2015-06-09 20:36:54

标签: c# data-structures hashmap hashtable

我需要将一个字符串(最大长度= 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函数的结果相当于很长时间甚至无法处理的大数字。

任何人都可以帮我解决如何进行此转换的权利吗?

2 个答案:

答案 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会移位。这些细节可能有所不同。