2

我想从一个唯一的 24 个字符的字符串中获取一个 8 个字符的字符串,以便制作一个缩短的 URL。8 个字符的字符串必须基于唯一的 24 个字符的字符串。如果我创建一个随机的 8 个字符串,那么必须进行数据库查找才能看到它还没有被占用。另外我不想使用 24 个字符串的前 8 个字符或后 8 个字符。这 24 个字符是一个 MongoDB 对象 ID。谢谢。

4

3 回答 3

3

8 太少了。

以下是如何从 24 中获得 16:

$id = '507f191e810c19729de860ea';

$str = base64_encode(implode('', array_map(function($c) { return chr(hexdec($c)); }, str_split($id, 2))));

var_dump($str); // UH8ZHoEMGXKd6GDq

对于更少的字符,您需要更大的字符库,但问题是 - 没有安全的 url。

于 2013-02-28T22:26:47.350 回答
1

假设你的 24 char 字符串是大写+小写字母数字,那就是

26+26+10 chars = 62 chars = 6 bits required to present them, and
24 * 6 = 144 bits to store them.

144 位/8 位/字节 = 18 字节。您不能将 24 个字符压缩为 8 个字符而不会发生潜在冲突。8 个字符,8 位/字符 = 最大 64 位。

于 2013-02-28T22:34:33.300 回答
0

我认为没有办法做到这一点,除非您确定 24 个字符的字符串具有某种模式,并且从该模式中您可能可以制作一个 8 个字符的唯一字符串。您可以使用 md5 创建 32 个字符的唯一字符串,例如取中间 8 个字符,但这只会减少冲突的机会,并且不能保证它是唯一的

于 2013-02-28T22:24:25.787 回答