在T-SQL和Python之间为Unicode字符生成MD5哈希

在T-SQL和Python之间为Unicode字符生成MD5哈希,python,python-3.x,tsql,hash,collation,Python,Python 3.x,Tsql,Hash,Collation,我有一个Unicode字符串,我想使用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); RE

我有一个Unicode字符串,我想使用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')


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

SQL(VARCHAR):'FE0E48AA12DF0075C8E2846796B44F10'

SQL(NVARCHAR):'C2A503D87D5EEF7340EDF6EC51DD2C47'

Python:'CE88EADF61D061E8929363169DB60EF8'

有没有办法重写这两个函数以获得相同的结果


我当前的数据库排序规则是SQL\u Latin1\u General\u CP1\u CS\u AS。在T-SQL函数中使用NVARCHAR对我没有任何帮助。

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

应该有一种方法,它不需要创建一个表来强制排序,但是已经过了我的就寝时间,所以我将把它作为练习留给读者


示例。

如何使用
@INPUT VARCHAR(100)
而不是
NVARCHAR
测试Unicode字符串?Ị 已经尝试将所有内容切换到NVARCHAR,但它不起作用…抱歉,但“它不起作用”并没有太大的作用。如果您编辑您的问题以包含完整的代码示例和数据以及实际结果和预期结果,也许有人可以提供帮助。向我们展示每种情况下输入MD5()的十六进制。您好,我已编辑以添加此问题中使用的完整代码您好,谢谢您的回答,但不幸的是,我目前使用的Azure Synapse还不支持UTF-8排序
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")
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;