将url转换为唯一的32个字符标记

时间:2010-08-16 06:19:01

标签: php encryption encoding compression

我正在写一个联盟系统,我想从网址生成一个唯一的32个字符宽的令牌。

问题是URL最长可达128个字符(IIRC)。有没有办法可以从给定的URL创建一个唯一的32个char宽的密钥/令牌,没有任何“冲突”?

我不确定这是否是编码,加密或散列问题(可能是这三者的混合)。

我将使用PHP实现这个'映射函数',因为这是我用来构建这个特定系统的语言。关于如何做到这一点的任何建议?

甚至可以将128个char字符串唯一地映射到32个字符串中(即没有碰撞?)...

[编辑]

我只是做了一些阅读,发现网址的最大长度实际上是2K左右。但是,我不担心那种“愚蠢”的边缘情况。我很确定99.9%的时间,我强加的128个字符的限制应该足够了。

2 个答案:

答案 0 :(得分:6)

  

甚至可以映射128个字符   串成一个32字符串唯一的字符串   (即没有碰撞?)......

部分。您可以使用md5sha1之类的哈希函数。这就是他们要做的事情。
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个可能值。

根据您想要做什么,您应该增加哈希的长度或重新考虑整体方法。