Я хочу предоставить нашим пользователям в базе данных уникальный буквенно-цифровой идентификатор. Я использую код ниже, будет ли он всегда генерировать уникальный идентификатор? Ниже приведена обновленная версия кода:
старый php:
// Generate Guid function NewGuid() { $s = strtoupper(md5(uniqid(rand(),true))); $guidText = substr($s,0,8) . '-' . substr($s,8,4) . '-' . substr($s,12,4). '-' . substr($s,16,4). '-' . substr($s,20); return $guidText; } // End Generate Guid $Guid = NewGuid(); echo $Guid; echo "<br><br><br>";
Новый PHP:
// Generate Guid function NewGuid() { $s = strtoupper(uniqid("something",true)); $guidText = substr($s,0,8) . '-' . substr($s,8,4) . '-' . substr($s,12,4). '-' . substr($s,16,4). '-' . substr($s,20); return $guidText; } // End Generate Guid $Guid = NewGuid(); echo $Guid; echo "<br><br><br>";
Будет ли второй (новый php) код гарантировать 100% уникальность.
Итоговый код:
PHP
// Generate Guid function NewGuid() { $s = strtoupper(uniqid(rand(),true)); $guidText = substr($s,0,8) . '-' . substr($s,8,4) . '-' . substr($s,12,4). '-' . substr($s,16,4). '-' . substr($s,20); return $guidText; } // End Generate Guid $Guid = NewGuid(); echo $Guid; $alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'; function base_encode($num, $alphabet) { $base_count = strlen($alphabet); $encoded = ''; while ($num >= $base_count) { $div = $num/$base_count; $mod = ($num-($base_count*intval($div))); $encoded = $alphabet[$mod] . $encoded; $num = intval($div); } if ($num) $encoded = $alphabet[$num] . $encoded; return $encoded; } function base_decode($num, $alphabet) { $decoded = 0; $multi = 1; while (strlen($num) > 0) { $digit = $num[strlen($num)-1]; $decoded += $multi * strpos($alphabet, $digit); $multi = $multi * strlen($alphabet); $num = substr($num, 0, -1); } return $decoded; } echo base_encode($Guid, $alphabet); }
Поэтому для более сильной уникальности я использую $ Guid в качестве генератора ключей. Это должно быть хорошо?
Если вы хотите, чтобы идентификатор был уникальным, вы должны сгенерировать GUID с помощью uniqid .
Ваш метод не гарантирует уникальность вообще. И, скорее всего, создадут столкновения.
Приведенный ниже код генерирует вам уникальный буквенно-цифровой идентификатор из числа. Я взял его из групп Flickr . Две функции для кодирования и декодирования:
$alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'; function base_encode($num, $alphabet) { $base_count = strlen($alphabet); $encoded = ''; while ($num >= $base_count) { $div = $num/$base_count; $mod = ($num-($base_count*intval($div))); $encoded = $alphabet[$mod] . $encoded; $num = intval($div); } if ($num) $encoded = $alphabet[$num] . $encoded; return $encoded; } function base_decode($num, $alphabet) { $decoded = 0; $multi = 1; while (strlen($num) > 0) { $digit = $num[strlen($num)-1]; $decoded += $multi * strpos($alphabet, $digit); $multi = $multi * strlen($alphabet); $num = substr($num, 0, -1); } return $decoded; }
ОБНОВИТЬ
Применение:
echo base_encode(123456789, $alphabet); //should output: bUKpk
uniqid: <?php $substr = substr(md5(rand()),0,22);echo " $substr ";?>
Если он действительно случайный, то вы не можете гарантировать уникальность (если вы не будете генерировать случайные ключи и проверять их против своей базы данных, пока не найдете новую, что является ужасной идеей).
Нужно ли быть случайным?
Почему бы просто не использовать столбец автоинкремента в таблице, а затем преобразовать его в base-62 (или так), если вы хотите ссылаться на него как буквенно-цифровое значение?