在服务器端计算Md5

时间:2015-09-15 14:55:11

标签: c# sql-server file-upload linq-to-sql md5

我使用html5上传文件并在客户端计算md5(JavaScript) 然后在服务器端(处理程序)我将文件切片插入这样的表:

public void WriteBlobsToDB(byte[] buffer,int id)
    {
        File_Data fl = new File_Data();
        fl.FileId = id;
        fl.FileChunks = buffer;
        try
        {
            WiFileData.InsertOnSubmit(fl);
            dc.SubmitChanges();
        }
        catch (ExecutionEngineException e){throw e;}
    }

然后当所有文件切片都保存在数据库中时,我会尝试将它们保存在byte[] allData中并将其插入另一个表中:

public void WriteBlobs(int id, string fileName,int count,byte[] allData)
{
    List<chunkInfo> listOfChunks;
    File_Data fd = new File_Data();
    File_List fl = new File_List();
    try
    {   var chunks = (from c in FileData
                      where c.FileId == id
                      orderby c.Id ascending
                      select new chunkInfo
                      {  Id = c.Id,
                         ChunkData = c.FileChunks.ToArray()
                      });
        listOfChunks = chunks.ToList();

        foreach (chunkInfo sChunk in listOfChunks)
        {   fl.FileId = id;
            fl.FileName = fileName;
            int dstoffset = count * sChunk.ChunkData.Length;// count is set to 0 at teh beggginning
            Buffer.BlockCopy(sChunk.ChunkData, 0, allData, dstoffset, sChunk.ChunkData.Length);
            count++;
        }
        int l = allData.Length;
        fl.FileData = new Binary(allData);
        FileList.InsertOnSubmit(fl);
        dc.SubmitChanges();

    }
    catch (Exception){throw;}
}

代码正在运行,我正在将数据保存在数据库中,allDatasize最终与我的文件大小相同。我只需要验证表中Filedata字段中保存的数据是否写入。如何计算md5并进行比较呢?

由于

1 个答案:

答案 0 :(得分:1)

如果你问你如何在SQL Server中完全实现这一点,你可以简单地利用HASH_BYTES函数,如下所示:

select  stored_md5_column, hashbytes('MD5', Filedata) as md5hash
from    your_table
where   stored_md5_column != hashbytes('MD5', Filedata);

取决于您如何存储&#34; stored_md5_column&#34;值,您可能需要将hashbytes的结果转换为其他内容以自然地进行正确的相等比较。

如果您反而希望在C#中执行检查/验证,那么您可能希望在填充allData数组缓冲区之后使用MD5 class之类的内容:

using (var md5Obj = MD5.Create())
{
    var md5Hash = md5Obj.ComputeHash(allData);
}

这假设你的allData是一个字节数组(我不能从你的代码中说出来)。如果它不是字节数组,您首先需要将其转换为标准字节数组或流以传递给MD5 ComputeHash方法。