DB表键的其他Hash Key相关功能有哪些?

时间:2015-05-06 23:17:06

标签: database cryptography key hash-function

我们在其中一个源表中使用Hash-Key函数来创建唯一标识符键。但是Hash-Key函数对32位整数有一些限制。我们尝试使用MD5,但我们不想使用基于Char的密钥来处理基于Char的数据。

1 个答案:

答案 0 :(得分:0)

你可能会发现this question我有兴趣进一步阅读。其中一个答案链接到此MySQL documentation page,建议对任意字节值的字符串使用VARBINARY字段。你没有标记你的问题,所以我将用MySQL来表达这个答案的其余部分;希望您选择的RDBMS不难转化为。

  

许多加密和压缩函数返回结果可能包含任意字节值的字符串。如果要存储这些结果,请使用具有VARBINARYBLOB二进制字符串数据类型的列。这将避免可能会更改数据值的尾随空格删除或字符集转换的潜在问题,例如,如果您使用非二进制字符串数据类型(CHARVARCHARTEXT),则可能会出现此问题

哈希函数输出基本上是一个非常长的数字。您经常将它们视为字符串,因为许多代码库会将它们显示为某种编码格式(十六进制或Base32)。正如你的问题所说,将这些放入非二进制字符串字段是一个坏主意,浪费空间和查找时间。因此,让您的应用程序将哈希的输出转换为二进制数据(最常见的是byte[]),并将它们存储在VARBINARY列中。

另一种选择是将其保留为字符串并将其编码为Base32(每字节5位),这比十六进制(每字节4位)浪费的空间要少得多 - 确切地说要少25%。这样做的主要优点是字符串保持人类可读性,并且可以通过通用协议传输而无需进一步编码。这样可以更轻松地将数据库与Web可见数据进行匹配,从而节省大量的开发和调试时间。然后将列设置为使用_bin collation type,这会加速比较,但代价是会失去区分大小写。

请注意,您不能将此技巧与Base64编码(每字节6位)一起使用,因为base64输出本身区分大小写。