我想得到给定字符串的64位哈希码。我怎么能以最快的方式做到这一点? 有一个准备好的方法来获取32位哈希码,但我需要64位。
我正在寻找只有整数散列。不是md5。
非常感谢。
C#4.0
答案 0 :(得分:15)
简单的解决方案:
public static long GetHashCodeInt64(string input)
{
var s1 = input.Substring(0, input.Length / 2);
var s2 = input.Substring(input.Length / 2);
var x= ((long)s1.GetHashCode()) << 0x20 | s2.GetHashCode();
return x;
}
答案 1 :(得分:8)
此代码来自Code Project Article - Convert String to 64bit Integer
static Int64 GetInt64HashCode(string strText)
{
Int64 hashCode = 0;
if (!string.IsNullOrEmpty(strText))
{
//Unicode Encode Covering all characterset
byte[] byteContents = Encoding.Unicode.GetBytes(strText);
System.Security.Cryptography.SHA256 hash =
new System.Security.Cryptography.SHA256CryptoServiceProvider();
byte[] hashText = hash.ComputeHash(byteContents);
//32Byte hashText separate
//hashCodeStart = 0~7 8Byte
//hashCodeMedium = 8~23 8Byte
//hashCodeEnd = 24~31 8Byte
//and Fold
Int64 hashCodeStart = BitConverter.ToInt64(hashText, 0);
Int64 hashCodeMedium = BitConverter.ToInt64(hashText, 8);
Int64 hashCodeEnd = BitConverter.ToInt64(hashText, 24);
hashCode = hashCodeStart ^ hashCodeMedium ^ hashCodeEnd;
}
return (hashCode);
}
答案 2 :(得分:4)
我使用过@Kirill解决方案。我有点奇怪,我不喜欢“var”(我想这是因为我来自c ++)所以我做了一个变种:
string s1 = text.Substring(0, text.Length / 2);
string s2 = text.Substring(text.Length / 2);
Byte[] MS4B = BitConverter.GetBytes(s1.GetHashCode());
Byte[] LS4B = BitConverter.GetBytes(s2.GetHashCode());
UInt64 hash = (UInt64)MS4B[0] << 56 | (UInt64)MS4B[1] << 48 |
(UInt64)MS4B[2] << 40 | (UInt64)MS4B[3] << 32 |
(UInt64)LS4B[0] << 24 | (UInt64)LS4B[1] << 16 |
(UInt64)LS4B[2] << 8 | (UInt64)LS4B[3] ;
我不太确定字节的顺序,取决于机器,(无论是小端还是大端)但是,谁在乎呢?它只是一个数字(哈希)。谢谢@Kirill,这对我非常有用!
答案 3 :(得分:3)
我假设您指的是当前使用的MD5哈希算法?
你可以做两倍长度的SHA 256 ....
http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256.aspx
...提取
byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA256 shaM = new SHA256Managed();
result = shaM.ComputeHash(data);
答案 4 :(得分:0)
由于问题是关于制作URL我假设你总是需要相同的散列64位int。 GetHashCode不能以这种方式可靠。为了制作一个碰撞很少的哈希,我使用这个。
public static ulong GetUInt64Hash(HashAlgorithm hasher, string text)
{
using (hasher)
{
var bytes = hasher.ComputeHash(Encoding.Default.GetBytes(text));
return Enumerable.Range(0, bytes.Length / 8) //8 bytes in an 64 bit interger
.Select(i => BitConverter.ToUInt64(bytes, i * 8))
.Aggregate((x, y) => x ^ y);
}
}
要使用它,只需传递您喜欢的任何算法
ulong result = GetUInt64Hash(SHA256.Create(), "foodiloodiloo")
或
ulong result = GetUInt64Hash(MD5.Create(), "foodiloodiloo")
这个和已接受的答案之间的区别在于这一个XOR的所有位,你可以使用你想要的任何算法
答案 5 :(得分:0)
我将介绍一个新的可能答案。 xxHash非常快。在此处查看基准测试:
https://cyan4973.github.io/xxHash/
它具有NuGet软件包: https://www.nuget.org/packages/System.Data.HashFunction.xxHash
这里的其他答案可能是1.关于它们是否真正防止冲突存在疑问,或者是2.仅包装了现有的大型且缓慢的HashAlgorithm实现。
xxHash不是加密技术的强项,但它似乎更适合您的需求。其: