在 PHP 中生成唯一的 ID(用于 URL 缩短器)

12 浏览
0 Comments

在 PHP 中生成唯一的 ID(用于 URL 缩短器)

如何使用PHP生成最多6个字符的唯一组合,使用(0-9),(a-z)和(A-Z)? 这些将是多少可能的组合? (例如,AAaa与Aaaa不同)?

admin 更改状态以发布 2023年5月21日
0
0 Comments

我的建议(尤其是如果您已经使用数据库来存储它们)是让数据库使用自增数字生成一个唯一的行ID,然后将该数字转换为您的代码,这是保证唯一的,因为它是由数据库生成的。

在生成代码方面,我的建议是简单的替换,因此创建一个字符串,其中包含所有可能的字符,并将您的数字转换为62(所有字符的计数),为每个字符或数字替换一个字母。

AaBbCcDd...0123456789

(另外,我建议移除lIioO01,因为它们都看起来非常相似)

正如Dan Grossman在下面的评论中建议的那样,以下代码将为您提供一个非常好的近似值。

$code = base_convert($number, 10, 36);

这将给您一个基于数字和字母0-9和a-z的数字。

0
0 Comments

使用base_convert($number, 10, 36)将不会像问题中指定的那样将a-zA-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
?>

0