应该使用哪种数据类型来存储哈希?
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
,因为散列函数将始终为相同类型的散列返回相同数量的字节(例如MD5
、SHA1
等)。这将减少管理可变长度二进制 (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)中?