我想为数据库中的用户提供唯一的字母数字ID。我使用下面的代码,这将始终生成一个唯一的ID?以下是代码的更新版本:
旧的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作为密钥生成器。那应该没问题呢?
答案 0 :(得分:3)
如果您希望ID唯一,则应generate a GUID using uniqid。
您的方法根本不能保证唯一性。并且可能会造成碰撞。
答案 1 :(得分:2)
下面的代码会从数字生成一个唯一的字母数字ID。我从Flickr groups拿走了它。编码和解码的两个功能:
$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
答案 2 :(得分:2)
uniqid:<?php $substr = substr(md5(rand()),0,22);echo " $substr ";?>
答案 3 :(得分:1)
如果它真的是随机的,那么你不能保证唯一性(除非你继续生成随机密钥并在你找到新的数据库之前检查它们,这是一个可怕的想法)。
它真的需要随机吗?
为什么不在表中使用自动增量列,如果要将其作为字母数字值引用,则将其转换为base-62(或左右)?