SQL 服务器哈希算法
SQL Server hash algorithms
如果我的输入长度小于散列输出长度,有没有什么散列算法可以保证不冲突。
我天生就知道,由于散列的有损性质,单向散列可能会在多个输入之间发生冲突,尤其是考虑到输入大小通常大于输出大小时,但这是否仍然适用于较小的输入大小?
使用随机选择的静态密钥的对称分组密码。加密永远不会产生重复,因为这会阻止明确的解密。
此方案将强制输出长度为密码块大小的倍数。如果你可以使用可变长度输出,你也可以使用流密码。
你的问题听起来像是在寻找一个完美的哈希函数。完美哈希函数的问题在于它们倾向于针对特定数据集进行定制。
以下假设您没有试图隐藏、保护或加密数据...
换个角度想,"generate" 接受您的输入的完美散列函数的最简单方法是将您要存储的数据映射到 table 并将这些输入相关联带有代理主键。然后,您为一列(或多列)创建唯一约束,以确保您映射的输入仅映射到单个代理值。
代理键可以是 int、bigint 或 guid。这完全取决于您要存储多少行。
如果已知您的输入长度很小,例如 32 位,那么您实际上可以枚举所有可能的输入并检查生成的哈希值是否存在冲突。这只会是 4294967296 个可能的输入,并且不应该花很长时间来枚举所有这些输入。本质上,您将构建彩虹 table 来测试碰撞。
如果有一些安全依赖于此,问题之一是如果攻击者知道您的输入长度受到限制,那么他们也很容易执行相同的枚举来创建 map/table这会将哈希值映射回原始值。 "attacker" 在这里是一个非常糟糕的术语,因为我不知道您如何使用这些哈希以及您是否担心能够逆转它们。
如果我的输入长度小于散列输出长度,有没有什么散列算法可以保证不冲突。
我天生就知道,由于散列的有损性质,单向散列可能会在多个输入之间发生冲突,尤其是考虑到输入大小通常大于输出大小时,但这是否仍然适用于较小的输入大小?
使用随机选择的静态密钥的对称分组密码。加密永远不会产生重复,因为这会阻止明确的解密。
此方案将强制输出长度为密码块大小的倍数。如果你可以使用可变长度输出,你也可以使用流密码。
你的问题听起来像是在寻找一个完美的哈希函数。完美哈希函数的问题在于它们倾向于针对特定数据集进行定制。
以下假设您没有试图隐藏、保护或加密数据...
换个角度想,"generate" 接受您的输入的完美散列函数的最简单方法是将您要存储的数据映射到 table 并将这些输入相关联带有代理主键。然后,您为一列(或多列)创建唯一约束,以确保您映射的输入仅映射到单个代理值。
代理键可以是 int、bigint 或 guid。这完全取决于您要存储多少行。
如果已知您的输入长度很小,例如 32 位,那么您实际上可以枚举所有可能的输入并检查生成的哈希值是否存在冲突。这只会是 4294967296 个可能的输入,并且不应该花很长时间来枚举所有这些输入。本质上,您将构建彩虹 table 来测试碰撞。
如果有一些安全依赖于此,问题之一是如果攻击者知道您的输入长度受到限制,那么他们也很容易执行相同的枚举来创建 map/table这会将哈希值映射回原始值。 "attacker" 在这里是一个非常糟糕的术语,因为我不知道您如何使用这些哈希以及您是否担心能够逆转它们。