【问题标题】:Generate MD5 HASH BETWEEN T-SQL and Python for Unicode character在 T-SQL 和 Python 之间为 Unicode 字符生成 MD5 HASH
【发布时间】:2021-03-18 01:19:27
【问题描述】:

我有一个 Unicode 字符串,我想使用 2 种不同的工具(Python 和 T-SQL)对其进行哈希处理: 我尝试了以下功能:

CREATE FUNCTION dbo.[FUNC_HASH] (@INPUT VARCHAR(100)) RETURNS VARCHAR(36)
AS
    BEGIN
    DECLARE @RESULT VARCHAR(36);
    SET @RESULT = CONVERT(VARCHAR(100),HASHBYTES('MD5',@INPUT),1);

    RETURN SUBSTRING(@RESULT,3,34)
    END
GO

SELECT dbo.[FUNC_HASH]('HĐTID123')

ALTER FUNCTION dbo.[FUNC_HASH] (@INPUT NVARCHAR(100)) RETURNS NVARCHAR(36)
AS
    BEGIN
    DECLARE @RESULT NVARCHAR(36);
    SET @RESULT = CONVERT(NVARCHAR(100),HASHBYTES('MD5',@INPUT),1);

    RETURN SUBSTRING(@RESULT,3,34)
    END
GO

SELECT dbo.[FUNC_HASH](N'HĐTID123')

import hashlib

def hash_coverter(source_str):
    result =  str(hashlib.md5(str(source_str).encode('utf-8')).hexdigest()).upper()
    return result
hash_coverter("HĐTID123")

使用非 Unicode 字符串进行测试时,例如“TID123” 他们都返回相同的答案:'2BDD0FE0AEA9FBC5C27A75085FB14388' 但是当我插入一个 Unicode 字符串时,例如,“HĐTID123”,它们会返回一组不同的结果。

SQL(VARCHAR) : 'FE0E48AA12DF0075C8E2846796B44F10'

SQL(NVARCHAR):'C2A503D87D5EEF7340EDF6EC51DD2C47'

Python:'CE88EADF61D061E8929363169DB60EF8'

有什么方法可以重写这两个函数以获得相同的结果?

我当前的数据库排序规则是 SQL_Latin1_General_CP1_CS_AS。在 T-SQL 函数中使用 NVARCHAR 对我一点帮助都没有。

【问题讨论】:

  • 如何用@INPUT VARCHAR(100)而不是NVARCHAR测试Unicode字符串?
  • Ị 已尝试将所有内容切换到 NVARCHAR,但它不起作用...
  • 很抱歉,但“它行不通”并没有什么好说的。如果您编辑您的问题以包含带有数据的完整代码示例以及实际和预期结果,也许有人可以提供帮助。
  • 向我们展示在每种情况下输入 MD5() 的十六进制数。
  • 嗨,我已经编辑添加了在这个问题中使用的完整代码

标签: python python-3.x tsql hash collation


【解决方案1】:

UTF-8 似乎是问题所在。 SQL Server 2019 支持 UTF-8 排序规则:

declare @Samples as Table ( Input VarChar(100) collate LATIN1_GENERAL_100_CI_AS_SC_UTF8 );
insert into @Samples ( Input ) values ( N'HĐTID123' );

select Convert( NVarChar(100), HashBytes( 'MD5', Input ), 1 ) from @Samples;

返回0xCE88EADF61D061E8929363169DB60EF8

应该有一种不涉及创建表格来强制排序的方法,但这是在我就寝时间之后,所以我将把它作为练习留给读者。

DBfiddle 示例。

【讨论】:

  • 嗨 Habo 感谢您的回答,但不幸的是,我目前正在使用尚不支持 UTF-8 排序规则的 Azure Synapse
猜你喜欢
  • 2011-04-01
  • 1970-01-01
  • 2019-06-24
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 2015-02-22
  • 1970-01-01
相关资源
最近更新 更多