url中的PHP唯一标识字段


PHP unique identy field in url

我左右为难。我需要我的数据库表中的唯一字符串来显示在url中(我不在url中显示id)。

我想在php中生成唯一的字符串,如果不生成新的,请检查它在表中是否唯一。

对于一个长度为8个字符、行数较多(约100000行)的字符串,您认为它的性能如何。

您可以使用uniqid()在php中创建一个唯一的id。

生成新ID时,请检查DB以查看它是否存在。如果是,请创建一个新的假设您在数据库中的该列上设置了索引,那么这些检查将不会非常昂贵。

在伪(-ish)代码中:

while (true) {
  $id = uniqid();
  if (!id_exists_in_db($id)) // we have a unique id
    break;  
}

您也可以创建一个函数,将id散列或编码为字符串,而不是在id之外生成唯一的键。例如,可以将整数转换为8个字符的十六进制表示形式。如果你愿意,你可以让它变得更复杂一点,但仍然可以很容易地编写一个函数,它使用固定的公式将数字转换为8个字母,反之亦然。这样,您就不需要存储这些额外的数据,也不必担心值是唯一的。

<?php
function translate($key, $back)
{
  $key = str_pad($key, 8, '0', STR_PAD_LEFT);
  $a = array('1','2','3','4','5','6','7','8','9','0');
  $b = array('a','b','c','d','e','f','g','h','i','j');
  if ($back) {$c = $b; $b = $a; $a = $c;}
  return str_replace($a, $b, $key);
}
function encode_id($int)
{
  return translate($int, false);
}
function decode_id($key)
{
  return (int)translate($key, true);
}
$key = encode_id(40000);
$int = decode_id($key);
echo $key;
echo '<br>';
echo $int;