在SQLServer2005中使用MD5在varbinary上执行校验和文件
我正在尝试对MSSQL 2005中上传到varbinary字段的文件进行MD5检查 我上传了文件并使用在SQLServer2005中使用MD5在varbinary上执行校验和文件,sql,sql-server-2005,file,md5,varbinary,Sql,Sql Server 2005,File,Md5,Varbinary,我正在尝试对MSSQL 2005中上传到varbinary字段的文件进行MD5检查 我上传了文件并使用 SELECT DATALENGTH(thefile) FROM table 我得到的字节数与文件的字节数相同 但是使用MD5计算器(来自bullzip)我得到了这个MD5: 20cb960d7b191d0c8bc390d135f63624 44c29edb103a2872f519ad0c9a0fdaaa 使用SQL,我得到了这个MD5: 20cb960d7b191d0c8bc390d13
SELECT DATALENGTH(thefile) FROM table
我得到的字节数与文件的字节数相同
但是使用MD5计算器(来自bullzip)我得到了这个MD5:
20cb960d7b191d0c8bc390d135f63624
44c29edb103a2872f519ad0c9a0fdaaa
使用SQL,我得到了这个MD5:
20cb960d7b191d0c8bc390d135f63624
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;
可能是数据类型转换
任何提示都会有帮助
非常感谢:)可能是MD5 Calculator正在对文件内容+其他属性(例如:作者、最后处理日期等)进行MD5哈希。您可以尝试更改这些属性并进行另一次哈希,以查看结果是否相等(仅在使用MD5计算器之前和之后) 另一种可能性是关于您在SQL Server中真正保存了什么
所以,很明显,MD5计算器和SQL Server在散列不同的内容。什么?我向回答这个问题的人表示祝贺:)两个选项
选择DATALENGTH(@HashThis)
赋值后将为您带来1
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;
}
};
}
如果您将文件拉出并在文件系统中进行比较,它们是否仍然与原始文件匹配?我不能这样做,因为我对服务器的访问权限有限:(您可以将文件推入数据库,但无法恢复它???我只能在Management Studio上有限地访问有限的功能:(如果无法正常检查两个二进制文件是否相同,我认为您遇到了问题。是的,文件位于varbinary(max)上)但是这个文件大约有9Mb…我不知道我是否可以只在sqlyes上做这件事,你一定要利用clr函数,或者在SQLE之外做这件事。真遗憾,我不知道我是否可以访问clr。我会尝试在C中做些别的。非常感谢:)