HashByte&比较字符串

时间:2012-12-06 13:03:28

标签: sql sql-server sql-server-2008 hash

我们当前正在运行脚本以将Active Directory用户信息转储到数据库中。

当我们执行插入操作时,我们将所有值散列到Varbinary类型的哈希码列(8000)中。此列用于比较下次运行时的哈希值,以便我们仅更新已更改的记录。 目前,当比较结束时,它总是以不同的方式返回。

我已将脚本缩减为基本示例,但仍然会遇到同样的问题。 (企业人员是我的数据库中的本地表,我们将人员信息保存在其中)

SELECT 
    SamAccountName
INTO
    #TmpEnterprisePerson    
FROM OPENQUERY(ADSI, 'SELECT SamAccountName
              FROM ''LDAP://MyLdapDirectory''
              WHERE SamAccountName = ''myAccount''')

    select HashBytes('MD5',COALESCE(EP.SamAccountName, '') ) as originalHash
        , HashBytes('MD5',COALESCE(T.SamAccountName, '')) as NewHash
        , EP.SamAccountName as originalName
        , T.SamAccountName as newName
        , '"' + EP.SamAccountName + '"' as originalName2
        , '"' + T.SamAccountName + '"' as newName2
        , CAST(COALESCE(EP.SamAccountName, '') AS VARbinary(max)) as oriBinaryName
        , CAST(COALESCE(T.SamAccountName, '') AS VARbinary(max)) as newBinaryName
        , len(ep.samaccountName) as originallength
        , len(T.samaccountName) as newLength
    FROM
        [dbo].[EnterprisePerson] AS EP
        INNER JOIN #TmpEnterprisePerson T ON T.SamAccountName = EP.SamAccountName
where ep.SamAccountName= 'myAccount'


drop table #TmpEnterprisePerson

结果如下

OriginalHash = 0xEB4A732C6372E7F1558D4C95E34CE6FF
NewHash      = 0x82DDB9733D5A7532D1C2C734807BE756
OriginalName = MyAccount
NewName      = MyAccount //Same as originalName
OriginalNam2 = "MyAccount"
NewName2     = "MyAccount" //Same as originalName2
oriBinaryName= 0x4C415245415541
newBinaryName= 0x4C00410052004500410055004100
OriginalLen  = 7
NewLength    = 7

我不确定在比较哈希或者为什么会以不同的方式出现时我做错了什么

1 个答案:

答案 0 :(得分:1)

我相信你有一个数据类型问题。将T.SamAccountName转换为varchar(N) - 与存储在数据库中的类型相同(如果您希望转换为转换,则为强制转换)。

SELECT 
    SamAccountName
INTO
    #TmpEnterprisePerson    
FROM OPENQUERY(ADSI, 'SELECT SamAccountName
              FROM ''LDAP://MyLdapDirectory''
              WHERE SamAccountName = ''myAccount''')

    select HashBytes('MD5',COALESCE(EP.SamAccountName, '') ) as originalHash
        , HashBytes('MD5', convert(varchar(50), COALESCE(T.SamAccountName), ''))) as NewHash
        , EP.SamAccountName as originalName
        , T.SamAccountName as newName
        , len(ep.samaccountName) as originallength
        , len(T.samaccountName) as newLength
    FROM
        [dbo].[EnterprisePerson] AS EP
        INNER JOIN #TmpEnterprisePerson T ON T.SamAccountName = EP.SamAccountName
where ep.SamAccountName= 'myAccount'


drop table #TmpEnterprisePerson