如何解决生成连续的五位数字母数字ID
| 总体概述: 下面的函数吐出一个随机ID。我正在使用它提供确认别名来标识记录。但是,我不得不检查冲突(但是不太可能),因为我们只使用了5位数字的长度。根据下面列出的允许的字符,总共有3300万左右的组合。最终,我们将获得500万左右的记录,因此碰撞成为一个问题。 问题: 检查重复别名效率低下且资源过多。 500万条记录需要大量搜索。特别是在不同用户同时进行此搜索时。 我的问题: 有没有办法“自动递增”此功能允许的组合?意思是我只需要搜索最后一条记录的别名并转到下一个组合? 公认的局限性: 我意识到代码将与下面的函数有很大的不同。我还意识到mysql具有用于数字ID的自动递增功能,但是该项目要求使用五位数字的别名,并允许使用\'23456789ABCDEFGHJKLMNPQRSTUVWXYZ \'字符。我在这个问题上束手无策。 我目前的职能: public function random_id_gen($length)
{
$characters = \'23456789ABCDEFGHJKLMNPQRSTUVWXYZ\';
$max = strlen($characters) - 1;
$string = \'\';
for ($i = 0; $i < $length; $i++) {
$string .= $characters[mt_rand(0,$max)];
}
return $string;
}
解决方法
为什么不只在别名列上创建唯一索引?
CREATE UNIQUE INDEX uniq_alias ON MyTable(alias);
此时,您可以尝试插入/更新,如果返回错误,请生成新的别名,然后重试。
, 您真正需要做的是将基数从10转换为strlen($characters)
。
PHP带有一个内置的base_convert
函数,但是它不能完全满足您的要求,因为它将使用数字零,一和字母'o \',而这在您的版本中是没有的。因此,您将需要一个函数将base_convert
中的值从/映射到您的值:
function map_basing($number,$from_characters,$to_characters) {
if ( strlen($from_characters) != strlen($to_characters)) {
// ERROR!
}
$mapped = \'\';
foreach( $ch in $number ) {
$pos = strpos($from_characters,$ch);
if ( $pos !== false ) {
$mapped .= $to_characters[$pos];
} else {
// ERROR!
}
}
return $mapped;
}
现在您有了:
public function next_id($last_id)
{
$my_characters = \'23456789ABCDEFGHJKLMNPQRSTUVWXYZ\';
$std_characters =\'0123456789abcdefghijklmnopqrstuv\';
// Map from your basing to the standard basing.
$mapped = map_basing($last_id,$my_characters,$std_characters);
// Convert to base 10 integer and increment.
$intval = base_convert($mapped,strlen($my_characters),10);
$intval++;
// Convert to standard basing,then to our custom basing.
$newval_std = base_convert($intval,10,strlen($my_characters));
$newval = map_basing($newval_std,$std_characters,$my_characters);
return $newval;
}
可能有一些语法错误,但是您应该明白它的要旨。
, 您可以滚动自己的自动增量。尽管您必须弄清楚增量在哪个过程中,但是它可能效率很低。例如,如果您将随机字符串中的位置分配为整数并以(0)(0)(0)(0)(0)开头,则等于22222作为ID。然后获取下一个,只需将最后一个值递增到(0)(0)(0)(0)(1),这将转换为22223。如果最后一个达到您的字符串长度,则将其设为0并递增倒数第二,等等...它不是完全随机的,但它会递增且唯一。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。