Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQLServer2005中使用MD5在varbinary上执行校验和文件_Sql_Sql Server 2005_File_Md5_Varbinary - Fatal编程技术网

在SQLServer2005中使用MD5在varbinary上执行校验和文件

在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

我正在尝试对MSSQL 2005中上传到varbinary字段的文件进行MD5检查

我上传了文件并使用

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在散列不同的内容。什么?我向回答这个问题的人表示祝贺:)

两个选项

  • 不带大小修饰符的VARBINARY类型使用VARBINARY(1),因此您正在散列文件的第一个字节,
    选择DATALENGTH(@HashThis)
    赋值后将为您带来
    1
  • 如果改用varbinary(MAX),请记住,HASHBYTES只对输入的前8000字节进行哈希
  • 如果要执行超过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;
            }
        };
    }
    

    如果您将文件拉出并在文件系统中进行比较,它们是否仍然与原始文件匹配?我不能这样做,因为我对服务器的访问权限有限:(您可以将文件推入数据库,但无法恢复它???我只能在Management Studio上有限地访问有限的功能:(如果无法正常检查两个二进制文件是否相同,我认为您遇到了问题。是的,文件位于varbinary(max)上)但是这个文件大约有9Mb…我不知道我是否可以只在sqlyes上做这件事,你一定要利用clr函数,或者在SQLE之外做这件事。真遗憾,我不知道我是否可以访问clr。我会尝试在C中做些别的。非常感谢:)