如何在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
),但这是我获得的概念在,而不是实用性。从本质上讲,该方法是有效的,无论它有多么模糊和无用。
答案 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;
}
(这两种方法给出了相同的结果;第一种方法效率更高,但第二种方法可能更容易理解。)