在 PHP 中生成唯一的 ID(用于 URL 缩短器)
在 PHP 中生成唯一的 ID(用于 URL 缩短器)
如何使用PHP生成最多6个字符的唯一组合,使用(0-9),(a-z)和(A-Z)? 这些将是多少可能的组合? (例如,AAaa与Aaaa不同)?
admin 更改状态以发布 2023年5月21日
我的建议(尤其是如果您已经使用数据库来存储它们)是让数据库使用自增数字生成一个唯一的行ID,然后将该数字转换为您的代码,这是保证唯一的,因为它是由数据库生成的。
在生成代码方面,我的建议是简单的替换,因此创建一个字符串,其中包含所有可能的字符,并将您的数字转换为62(所有字符的计数),为每个字符或数字替换一个字母。
AaBbCcDd...0123456789
(另外,我建议移除lIioO01,因为它们都看起来非常相似)
正如Dan Grossman在下面的评论中建议的那样,以下代码将为您提供一个非常好的近似值。
$code = base_convert($number, 10, 36);
这将给您一个基于数字和字母0-9和a-z的数字。
使用base_convert($number, 10, 36)
将不会像问题中指定的那样将a-z
与A-Z
区分对待。需要使用自定义函数。
在数据库中使用一个int列作为主键,在插入时自动递增,然后在永久链接的逻辑中将此ID从十进制转换为基数62(62允许使用0-9、a-z和A-Z)。
创建一个新永久链接:
0) { $val = $dec % 62; $chars[] = $values[$val]; $dec -= $val; $dec /= 62; } // add zero-padding: while (count($chars) < 6) $chars[] = '0'; // convert to string $rv = implode( '' , array_reverse($chars) ); // if input was negative: return $neg ? "-$rv" : $rv; } // Usage example: // ... do mysql insert here and retrieve new insert_id into var $id ... $permalink = toBase62($id); ?>
解码请求的永久链接时:
0 ) { $char = array_pop($chars); $val += ($values[$char] * pow(62, $i) ); ++$i; } return $neg ? 0 - $val : $val; } // Usage example: // ... assuming permalink has been put in a var called $permalink $id = base62ToInt($permalink); // ... now look up $id in DB ?>