将字符串转换为Int(NOT PARSE)

时间:2014-01-29 14:34:38

标签: c# override gethashcode

如何在C#中获取字符串的数字表示?要清楚,我不想要指针的地址,我不想从int解析string,我想要字符串值的数字表示。

我想要这个的原因是因为我试图根据文件路径(path)和数字(line)生成哈希码。我基本上想要这样做:

String path;
int line;

public override int GetHashCode() {
    return line ^ (int)path;
}

我想要一个更好的方法的建议,但因为我正在覆盖我正在创建的类型的Equals()方法(检查对象的path和{{1} }是相同的),我需要在覆盖line

中反映出来

编辑:显然这种方法很糟糕,已经向我指出了,我明白了。下面的答案是完美的。但是,它并没有完全回答我的问题。如果有一种简单的方法来获得字符串值的整数表示,我仍然很好奇。我知道我可以遍历字符串,将GetHashCode的二进制表示添加到char并将该字符串转换为StringBuffer,但是有更干净的方式吗?

编辑2:我知道这是一个奇怪且非常有限的问题。转换为此方法会将int的大小限制为2 string s(2 16位char = 1 32位char),但这是我获得的概念在,而不是实用性。从本质上讲,该方法是有效的,无论它有多么模糊和无用。

2 个答案:

答案 0 :(得分:3)

如果你想要的只是一个HashCode,为什么不获取字符串的哈希码呢? .net中的每个对象都有一个GetHashCode()函数:

public override int GetHashCode() {
    return line ^ path.GetHashCode();
}

答案 1 :(得分:1)

出于GetHashCode的目的,您应绝对致电GetHashCode。但是,要回答问题的问题(在评论中澄清之后),这里有两个选项,返回BigInteger(否则你只会在溢出之前得到两个字符):

static BigInteger ConvertToBigInteger(string input)
{
    byte[] bytes = Encoding.BigEndianUnicode.GetBytes(input);
    // BigInteger constructor expects a little-endian byte array
    Array.Reverse(bytes);
    return new BigInteger(bytes);
}

static BigInteger ConvertToBigInteger(string input)
{
    BigInteger sum = 0;
    foreach (char c in input)
    {
        sum = (sum << 16) + (int) c;
    }
    return sum;
}

(这两种方法给出了相同的结果;第一种方法效率更高,但第二种方法可能更容易理解。)