2017-04-20 1 views
0

MySqlテーブルに暗号化されていないハッシングが必要なため、データをより高速に照会できます。 MySqlデータベースのハッシュ関数とC#アプリケーションは、指定された値に対して同じハッシュを生成する必要がありますが、それは文字列に保持する場合に限ります。私は文字列比較のオーバーヘッドを避けることができるように、それらをBIGINTに変換したい。私はSha256が暗号ハッシュ関数だが、少なくともMySqlとC#は与えられた入力に対して同じハッシュ・ストリングを生成することを知っているが、暗号化以外の用途には使用しても構わない。 MurmurHash3 X86のような他のオンライン利用可能なハッシュアルゴリズムをハッシュ衝突で試しました。どんな助けもありがとう。ありがとう!MySqlとC#のハッシュがBIGINTに変換中に一致しません

の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

+0

ここで、C#で 'BigInteger'に変換しますか?あなたはコードのその部分を投稿できますか? –

+0

@LukeParkこの行[var hash = BitConverter.ToInt64(hashBytes、0);]は、C#コードでBigIntegerに変換されます。 –

+0

いいえ、そうではありません。これは64ビット整数に変換されます。あなたのSHA256ハッシュは、名前が示すように、長さが256ビットです。 –

答えて

0

このanswerは私がこの問題を解決するのを助けました。

RIGHT 16文字を使用するのではなく、MySql側でLEFTに変更しました。

のMySQLのクエリ:

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; 

C#コード:

static void Main(string[] args) 
    { 
     var value = "MyString"; 

     using (var sha256 = SHA256.Create()) 
     { 
      var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(value)); 
      var hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower(); 

      Console.WriteLine(hash); 
     } 

     using (var sha256 = SHA256.Create()) 
     { 
      var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(value)); 
      var hash = BitConverter.ToInt64(hashBytes.Take(8).ToArray(), 0); 
      hash = IPAddress.HostToNetworkOrder(hash); 

      Console.WriteLine(hash); 
     } 

     using (var md5 = MD5.Create()) 
     { 
      var hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(value)); 
      var hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower(); 

      Console.WriteLine(hash); 
     } 

     using (var md5 = MD5.Create()) 
     { 
      var hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(value)); 
      var hash = BitConverter.ToInt64(hashBytes.Take(8).ToArray(), 0); 
      hash = IPAddress.HostToNetworkOrder(hash); 

      Console.WriteLine(hash); 
     } 

     Console.ReadLine(); 
    } 

のMySql結果:

MySql Result

C#の結果:

C# Result

私は3000万を超えるレコードをテストし、答えを更新します。

関連する問題