2012-01-03 3 views
3

イムをチェックサムファイルを実行するためにSQL Server 2005でMD5を使用して私は、ファイルをアップロードし、は、MSSQL 2005</p> <p>にvarbinary型のフィールドにアップロードされたファイルのMD5チェックをしようとvarbinary型に

SELECT DATALENGTH(thefile) FROM table 
を使用して

ファイルと同じバイト数を取得します。

しかし、(bullzipから)MD5計算機を使用して、私はこのMD5を取得:

20cb960d7b191d0c8bc390d135f63624 

とSQLを使用して、私はこのMD5を取得:

44c29edb103a2872f519ad0c9a0fdaaa 

フィールドが同じな長さを持っている場合、彼らは異なっている理由と私は同じバイトを仮定?そうする

私のSQLコードはでした:

DECLARE @HashThis varbinary; 
DECLARE @md5text varchar(250); 
SELECT @HashThis = thefile FROM CFile WHERE id=1; 

SET @md5text = SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',@HashThis)),3,32) 
PRINT @md5text; 

たぶん、データ型変換?

ヒントを教えてください。

どうもありがとう:)

+1

あなたがバックアウトファイル(複数可)を引くと比較するとそれらはファイルシステムでは、彼らはまだ元のファイルと一致しますか? – MatBailie

+0

サーバーへのアクセスが制限されているため、実際にはできません:( –

+0

DBにファイルをプッシュできますが、回復できません。 – MatBailie

答えて

3

つのオプション

  1. VARBINARYタイプをcongratzを与えるあなたは割り当てた後、ファイル、SELECT DATALENGTH(@HashThis)の非常に最初のバイトをハッシュしているので、修飾子は、VARBINARY(1)を利用もたらしますあなたの代わりにvarbinary型(MAX)を使用する場合1
  2. に - あなたは以上の8000バイトをハッシュ実行する場合HASHBYTESが入力

の唯一の最初の8000バイトをハッシュすることを、心に留めておきます - 独自のCLRのハッシュ関数を記述し、例えばファイルが私のSQL Serverプロジェクトから、それは、SQL Serverの外の他のハッシュ関数と同じ結果をもたらします:

using System; 
using System.Data.SqlTypes; 
using System.IO; 

namespace ClrHelpers 
{ 
    public partial class UserDefinedFunctions { 
     [Microsoft.SqlServer.Server.SqlFunction] 
     public static Guid HashMD5(SqlBytes data) { 
      System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
      md5.Initialize(); 
      int len = 0; 
      byte[] b = new byte[8192]; 
      Stream s = data.Stream; 
      do { 
       len = s.Read(b, 0, 8192); 
       md5.TransformBlock(b, 0, len, b, 0); 
      } while(len > 0); 
      md5.TransformFinalBlock(b, 0, 0); 
      Guid g = new Guid(md5.Hash); 
      return g; 
     } 
    }; 
} 
+0

はい、ファイルはvarbinary(max)にありますが、ファイルにはaprox 9Mbがあります...もし私がSQL上でそれを行うことができるかどうかわかりません –

+1

はい、間違いなくclr関数を利用するか、SQLの外で行う必要があります –

+0

恥、私はCLRを行うためにアクセスできるかどうかわかりません。私はC#で何かを試してみる。どうもありがとう :) –

1

それはMD5電卓は、ファイルの内容+他のプロパティのMD5ハッシュを作っているということができます(例:著者、最後のプロセスの日付など)。これらのプロパティを変更して、別のハッシュを作成して結果が等しいかどうか(MD5電卓だけを使用する前後)を確認してください。

もう一つの可能​​性はあなたが本当にSQL Serverで保存しているかについて..です


だから、それはMD5計算とSQL Serverがの異なるものをハッシュあり、かなり明確です。何?私はサイズなし:)それに答える人に