我正在写一个联盟系统,我想从网址生成一个唯一的32个字符宽的令牌。
问题是URL最长可达128个字符(IIRC)。有没有办法可以从给定的URL创建一个唯一的32个char宽的密钥/令牌,没有任何“冲突”?
我不确定这是否是编码,加密或散列问题(可能是这三者的混合)。
我将使用PHP实现这个'映射函数',因为这是我用来构建这个特定系统的语言。关于如何做到这一点的任何建议?
甚至可以将128个char字符串唯一地映射到32个字符串中(即没有碰撞?)...
[编辑]
我只是做了一些阅读,发现网址的最大长度实际上是2K左右。但是,我不担心那种“愚蠢”的边缘情况。我很确定99.9%的时间,我强加的128个字符的限制应该足够了。
答案 0 :(得分:6)
甚至可以映射128个字符 串成一个32字符串唯一的字符串 (即没有碰撞?)......
部分。您可以使用md5或sha1之类的哈希函数。这就是他们要做的事情。
MD5生成一个32字符串,SHA1生成一个40字符串。
当然你不能保证不会发生碰撞。这是不可能的,因为消息空间对于你的哈希来说太大了(如果使用MD5,有2个 1024 消息对2 128 可能的哈希),但这些函数是为了抗冲击,难以扭转。
http://en.wikipedia.org/wiki/Hash_function
http://en.wikipedia.org/wiki/MD5
http://en.wikipedia.org/wiki/SHA-1
答案 1 :(得分:1)
甚至可以将128个char字符串唯一地映射到32个字符串中(即没有碰撞?)...
这取决于用于输入和输出的字母表。如果生成的32个字符哈希限制为a-z
的字母,则可以在其中编码最多26^32 = 1.901722×10^45
个值。一个URL可以包含至少a-z
和许多其他字符,因此可以包含至少26^128 = 1.307942×10^181
个值。所以,26个字符的字母是不够的。
使用a-zA-Z0-9
您可以编码62^32 = 2.272658×10^57
个唯一值,这仍然不够。即使是100个字符的字母表也只能提供100^32 = 1.0×10^64
个可能值。
根据您想要做什么,您应该增加哈希的长度或重新考虑整体方法。