如何从24个字符串中获取唯一的8个字符串?

时间:2013-02-28 22:20:44

标签: php string mongodb unique

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

3 个答案:

答案 0 :(得分:2)

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

对于较少的角色,你需要有更大的角色基础,但问题是 - 没有网址安全。

答案 1 :(得分:1)

假设你的24个字符串是大写+低位字母数字,那就是

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

144bits / 8bits / byte = 18个字节。如果没有潜在的碰撞,你不能将24个字符压缩成8个字符。 8个字符,8位/字符= 64位最大值。

答案 2 :(得分:0)

我认为没有办法做到这一点,除非你确定24个字符的字符串有一些模式,并且从那个模式你可以制作一个8个字符的唯一字符串。您可以使用md5创建32个字符的唯一字符串,例如中间的8个字符,但它只会减少碰撞的几率,并且无法保证它是唯一的