我如何从一个24个字符的字符串得到一个唯一的8个字符字符串


How do I get a unique 8 character string from a 24 character string?

我想从一个唯一的24个字符串中得到一个8个字符串,以便缩短URL。8个字符的字符串必须基于唯一的24个字符串。如果我做一个随机的8个字符的字符串,那么将不得不有一个数据库查找,看看它还没有采取。另外,我不想使用前8个字符或最后8个字符的24个字符串。24个字符为MongoDB对象Id。谢谢。

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安全。

假设你的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 bytes。你不能把24个字符压缩成8个字符而不产生潜在的冲突。

我不认为有一种方法可以做到这一点,除非你确定24个字符的字符串有一些模式,从那个模式你可能可以做一个8个字符的唯一字符串。你可以用md5创建32个字符的唯一字符串例如取中间的8个字符但这只会减少冲突的可能性而且不能保证它是唯一的