【问题标题】:How to convert a hex encoded string to an integer in MS SQL?如何在 MS SQL 中将十六进制编码的字符串转换为整数?
【发布时间】:2020-11-22 07:39:12
【问题描述】:

我想将 HASHBYTES (SHA2_256) 函数返回的一段哈希字符串转换为 MS SQL Server 中的整数。

此查询返回'6BDA'

SELECT (SUBSTRING(CONVERT(VARCHAR(64), HASHBYTES('SHA2_256', CAST(12.5 AS VARCHAR(64))), 2), 61, 4)) as tmp

但是当我尝试将其转换为 int 时,会导致错误:

--Conversion failed when converting the varchar value '6BDA' to data type int.
SELECT (CONVERT(int, SUBSTRING(CONVERT(VARCHAR(64), HASHBYTES('SHA2_256', CAST(12.5 AS VARCHAR(64))), 2), 61, 4))) as tmp

如果我尝试将子字符串转换为 varbinary,然后再转换为 int,则结果与 27610 不同:

--Returns 910312513
SELECT (CONVERT(int, CONVERT(varbinary, SUBSTRING(CONVERT(VARCHAR(64), HASHBYTES('SHA2_256', CAST(12.5 AS VARCHAR(64))), 2), 61, 4)))) as tmp

Snowflake 中,我可以使用 to_number 函数轻松执行转换:

以下查询将'6BDA' 转换为 27610。如何使用 SQL Server 实现相同的结果?

SELECT to_number(substr(sha2(TO_VARCHAR(ABS(12.5)), 256), 61), 'xxxx')

【问题讨论】:

  • 我不确定你的实际用例,但如果你需要一个整数而不是字符串,你可以使用CAST(CAST(SUBSTRING(HASHBYTES('SHA2_256', CAST(12.5 AS VARCHAR(64))),31,2) AS varbinary(4)) AS int)

标签: sql sql-server hash cryptography snowflake-cloud-data-platform


【解决方案1】:

试试这个

SELECT CAST( CONVERT(VARBINARY,'0x'+RIGHT('00000000'+REPLACE(tmp,'x',''),8),1) AS INT)
from table1

我使用以下 DDL 对其进行了测试:

create table table1(tmp varchar(64));

insert into table1
SELECT SUBSTRING(CONVERT(VARCHAR(64), HASHBYTES('SHA2_256', CAST(12.5 AS VARCHAR(64))), 2), 61, 4) 

this Fiddle 中查看它的工作原理。

【讨论】:

  • 我也试过这个查询并且它有效(添加 2 为 Binary style)。您认为哪种方法更可取? SELECT (CONVERT(int, CONVERT(varbinary, SUBSTRING(CONVERT(VARCHAR(64), HASHBYTES('SHA2_256', CAST(12.5 AS VARCHAR(64))), 2), 61, 4), 2))) as tmp
  • 如果速度是一个因素,我会测试两者并选择更快的。如果没有,请选择您认为更具可读性的那个。
猜你喜欢
  • 2013-06-18
  • 2015-04-30
  • 2015-11-29
  • 2014-03-10
  • 2017-08-12
  • 2014-12-15
相关资源
最近更新 更多