Как воспроизвести поведение SQL NVARCHAR в Python при генерации SHA-512 ha sh? - PullRequest
0 голосов
/ 27 мая 2020

У меня есть следующий SQL запрос

SELECT CONVERT(VARCHAR(254), HASHBYTES('SHA2_512', CONVERT(NVARCHAR(24), '2020-05-27 00:00:00.000', 127)), 2)

, который генерирует ha sh value

E8FD9193FA939608DF127AC73428EB39F66CB6F44440083EF269A1F72176BF7BF80C3EB26BA43277E6F9CFFB4F7AFC6AA83AF527BEDF887E4EE06BA492CAD3BE

вне сегодняшней даты, и я хочу воспроизвести это ha sh в Python с

hashlib.sha512('2020-05-27 00:00:00.000'.encode()).hexdigest().upper()

, но я получаю

FE48F900755B4C19039E6886148566DF93730A7887771C7A72260BB4E784080CDDA6C70C428A6EEFED658846F45F3D153C6B6472C04508B9242C14C61BD1C1BE

как значение ha sh. Когда я использую VARCHAR вместо NVARCHAR, я получаю правильное значение ha sh. Как я могу воспроизвести поведение NVARCHAR в Python?

Ответы [ 2 ]

1 голос
/ 27 мая 2020
Строки

nvarchar и python по умолчанию должны быть символами Unicode и многобайтовыми символами. Однако есть еще два подтипа. Big Endian и Little Endian, где они различаются. Вам подойдет младший порядок байтов. Используйте кодировку utf-16le, чтобы получить нужный ответ.

hashlib.sha512('2020-05-27 00:00:00.000'.encode('utf-16le')).hexdigest().upper()
0 голосов
/ 27 мая 2020

NVARCHAR кодируется в UTF-16LE. Добавление его к

hashlib.sha512('2020-05-27 00:00:00.000'.encode('utf_16_le')).hexdigest().upper()

создает правильное значение ha sh.

...