我的MySql表需要非加密哈希,因此我可以更快地查询数据。 MySql数据库Hash函数和C#应用程序必须为给定值生成相同的散列,但只有在我保持字符串的情况下才会生成相同的散列。我想将它们转换为BIGINT,这样我就可以避免字符串比较的开销。我知道Sha256是加密哈希函数,但至少MySql和C#为给定的输入生成相同的哈希字符串,我不介意将它用于非加密使用。我尝试了其他在线可用的哈希算法,如MurmurHash3 X86,但有哈希冲突。任何帮助,将不胜感激。谢谢!
MySql查询:
SELECT SHA2('MyString', 256) AS Sha256, CONV(RIGHT(SHA2('MyString',256), 16), 16, 10) AS BIGINT_Sha256, MD5('MyString') AS MD_5, CONV(RIGHT(MD5('MyString'), 16), 16, 10) AS BIGINT_MD5;
C#代码:
static void Main(string[] args)
{
using (var sha256 = SHA256.Create())
{
var hashBytes = sha256.ComputeHash(Encoding.ASCII.GetBytes("MyString"));
var hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
Console.WriteLine(hash);
}
using (var sha256 = SHA256.Create())
{
var hashBytes = sha256.ComputeHash(Encoding.ASCII.GetBytes("MyString"));
var hash = BitConverter.ToInt64(hashBytes, 0);
Console.WriteLine(hash);
}
using (var md5 = MD5.Create())
{
var hashBytes = md5.ComputeHash(Encoding.ASCII.GetBytes("MyString"));
var hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
Console.WriteLine(hash);
}
using (var md5 = MD5.Create())
{
var hashBytes = md5.ComputeHash(Encoding.ASCII.GetBytes("MyString"));
var hash = BitConverter.ToInt64(hashBytes, 0);
Console.WriteLine(hash);
}
Console.ReadLine();
}
MySql结果:
C#结果:
答案 0 :(得分:0)
这answer帮我解决了这个问题。
我没有使用RIGHT 16个字符,而是在MySql端将其更改为LEFT。
MySql查询:
.horizontal-navigation-bar nav ul li a:not(.active-link):hover:after {
background: #000;
width: 100%;
}
C#代码:
SET @Value = 'MyString';
SELECT
SHA2(@Value, 256) AS Sha256,
CAST(CONV(LEFT(SHA2(@Value,256), 16), 16, 10) AS INT) AS BIGINT_Sha256,
MD5(@Value) AS MD_5,
CAST(CONV(LEFT(MD5(@Value), 16), 16, 10) AS INT) AS BIGINT_MD5;
MySql结果:
C#结果:
我将测试超过3000万条记录并更新答案。