可以采用N长度字符串并返回固定大小唯一值的算法?

时间:2010-06-26 21:26:27

标签: c++ c algorithm

我想在我的应用程序中添加基本许可。我想将用户名作为参数并返回一个唯一的,固定长度的代码(有点像MD5)

有哪些算法可以做到这一点? 感谢

4 个答案:

答案 0 :(得分:5)

SHA算法应该是不错的(SHA-1,SHA-512等......)。它们被用于很多地方,也可以使用MD5,但似乎更受尊重。我使用它们进行密码散列,但听起来它们的功能作为单向散列也适用于此。

如果你想要固定大小,你可能会对结果字节进行Base64编码并获取你想要的前N个数字。即使你丢失了一些原始哈希值,这应该会给你足够大的一组不同的可能键,你几乎不可能重复。作为参考框架,这是Base64编码的UUID的一个示例:“iFHqaiNjhTDpxp7ahBPX0A”

UUID的可能结果集是如此之大,以至于可以随意生成它们,并期望它们是唯一的(我知道这很令人惊讶,但是要进行搜索)。

答案 1 :(得分:2)

虽然同意之前关于生成唯一代码的MD5或SHA1哈希的建议,但您可能还需要关心确保这些代码不能轻易地进行逆向工程。在您的应用程序中,如果用户名(代码的基础)是公开可用的,那么攻击者(知道或猜测您的算法)可以自己创建代码。

如果这可能有问题,那么在创建哈希之前包含带有用户名字符串的随机盐字符串。盐可能只是一个随机数或时间戳 - 至少不是一件容易猜到的事情。您需要将其与哈希和用户名一起存储在许可证数据库中,以便能够验证许可证。

答案 2 :(得分:1)

一个简单的算法是将第n个素数提高到用户名中第i个字符的字母值(a = 1,b = 2,...)的幂。请参阅Godel Numbers

示例

用户名:Peter

唯一代码:2 ^ 16 + 3 ^ 5 + 5 ^ 20 + 7 ^ 5 + 11 ^ 18 = 5560012680923954692

答案 3 :(得分:0)

看起来像一个简单的32位或64位CRC可以工作。碰撞的理论机会远高于MD5 / SHA1等,但实际上,您会产生多少许可证?数十万?鉴于您使用名称作为输入(唯一的输入?),由于源数据中的冲突,您几乎肯定会发生冲突。