SQL Server哈希算法

时间:2015-01-09 21:47:38

标签: sql-server sql-server-2008 hash

如果我的输入长度小于散列输出长度,是否有任何散列算法可以保证不会发生冲突。

我天生就知道,由于散列的有损性质,单向散列可能会在多个输入上发生冲突,尤其是在考虑输入大小通常大于输出大小时,但这仍然适用于较小的输入大小?< / p>

3 个答案:

答案 0 :(得分:1)

使用带有随机选择的静态密钥的对称分组密码。加密永远不会产生重复,因为这会阻止明确的解密。

此方案将强制某个输出长度,该长度是密码块大小的倍数。如果您可以使用可变长度输出,也可以使用流密码。

答案 1 :(得分:0)

你的问题听起来像是在寻找一个完美的哈希函数。完美哈希函数的问题在于它们倾向于针对特定数据集进行定制。

以下假设您不是试图隐藏,保护或加密数据......

以另一种方式来思考,“生成”接受输入的完美哈希函数的最简单方法是将要存储的数据映射到表,并将这些输入与代理主键相关联。然后,您可以为列(或列)创建唯一约束,以确保您只将映射映射到单个代理值。

代理键可以是int,bigint或guid。这一切都取决于您要存储的行数。

答案 2 :(得分:0)

如果已知您的输入长度很小,例如32位,那么您实际上可以枚举所有可能的输入并检查产生的冲突哈希值。这只是4294967296可能的输入,并且不应该花费非常长的时间来枚举所有这些输入。基本上你要构建一个彩虹表来测试碰撞。

如果有一些安全性依赖于此,其中一个问题是如果攻击者知道您的输入长度受到约束,那么它们也可以轻松地执行相同的枚举来创建将映射哈希的映射/表回到原始值。 “攻击者”在这里是一个相当可怕的术语,因为我没有关于你如何使用这些哈希的背景以及你是否担心能够逆转它们。