将它们转换为BIGINT时,MySql和C#哈希值不匹配

时间:2017-04-20 20:54:47

标签: c# mysql asp.net encryption hash

我的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结果:

MySql Result

C#结果:

enter image description here

1 个答案:

答案 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结果:

MySql Result

C#结果:

C# Result

我将测试超过3000万条记录并更新答案。