应该使用哪种数据类型来存储哈希?

Posted

技术标签:

【中文标题】应该使用哪种数据类型来存储哈希?【英文标题】:What kind of datatype should one use to store hashes? 【发布时间】:2013-02-06 05:36:09 【问题描述】:

我了解哈希值会根据 SQL Server 中的不同数据类型而有所不同。一个支持 Unicode,另一个不支持 .... 以此类推(也是排序规则)

我使用 char(32) 作为数据类型,但输出很奇怪。 使用这个

select HASHBYTES('MD5','MD5Text')

给出这个输出:

0xA891DB2DA259280A66FD5F35201CAB6A

什么时候

declare @h char(32)
select @h=HASHBYTES('MD5','MD5Text')
select @h,LEN(@h)

输出:

Ё‘Ы-ўY( fэ_5 «j

所以我是 SQL Server 的新手。 谁能告诉我应该使用什么数据类型来存储哈希??

【问题讨论】:

msdn.microsoft.com/en-us/library/ms188362.aspx 【参考方案1】:

您应该使用binary 数据类型。您可以使用binary 代替varbinary,因为散列函数将始终为相同类型的散列返回相同数量的字节(例如MD5SHA1 等)。这将减少管理可变长度二进制 (varbinary) 列所需的(少量)开销。

就制作它的大小而言,您可以运行此查询来检查每种散列类型的长度:

SELECT  DATALENGTH(HASHBYTES('MD2', 'Testing')) AS [MD2Length],
        DATALENGTH(HASHBYTES('MD4', 'Testing')) AS [MD4Length],
        DATALENGTH(HASHBYTES('MD5', 'Testing')) AS [MD5Length],
        DATALENGTH(HASHBYTES('SHA', 'Testing')) AS [SHALength],
        DATALENGTH(HASHBYTES('SHA1', 'Testing')) AS [SHA1Length],
        /* 2012 only: */
        DATALENGTH(HASHBYTES('SHA2_256', 'Testing')) AS [SHA2_256Length],
        DATALENGTH(HASHBYTES('SHA2_512', 'Testing')) AS [SHA2_512Length];

它应该是这样的:

MD2Length MD4Length MD5Length SHALength SHA1Length SHA2_256Length SHA2_512Length
--------- --------- --------- --------- ---------- -------------- --------------
16        16        16        20        20         32             64

【讨论】:

对于md5哈希(16字节)为什么不使用uniqueidentifier而不是binary(16) @BaltoStar 我认为your question 上的答案/评论链接比我能更好地解决这个问题。

以上是关于应该使用哪种数据类型来存储哈希?的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用哪种数据类型将图像存储在数据库(PostgreSQL)中?

我应该使用哪种数据类型来处理九位数的帐号,为啥?

我应该使用哪种数据类型在C中存储25位以上的数字?

存储经度和纬度值需要哪种数据类型[重复]

Redis 数据类型分析 字符串 哈希 列表 集合 有序集合 优缺点 分析 注意事项 存储结构

哪种列类型用于将年份字段存储在具有年度数据行的表中