在TSQL和Python之间为Unicode字符生成MD5哈希

2024-10-02 20:42:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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')

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\u Latin1\u General\u CP1\u CS\u AS。在T-SQL函数中使用NVARCHAR对我没有任何帮助


Tags: 字符串inputsqlasunicodefunctionhashresult
1条回答
网友
1楼 · 发布于 2024-10-02 20:42:19

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示例

相关问题 更多 >