我在互联网上有人发布图片和短字符串的服务生成。只有一个可以使用。但是,我正在进入数据库中的重复内容,并且看到重大问题。随机字符串重复吗?
下面是我在用的:
$id=rand(10000,99999);
$short_string = base_convert($id,20,36);
什么是解决它的最好方法?从数据库中检查并保持循环,直到它不匹配?如果每一种可能的解决方案都会陷入无限循环呢?
我在互联网上有人发布图片和短字符串的服务生成。只有一个可以使用。但是,我正在进入数据库中的重复内容,并且看到重大问题。随机字符串重复吗?
下面是我在用的:
$id=rand(10000,99999);
$short_string = base_convert($id,20,36);
什么是解决它的最好方法?从数据库中检查并保持循环,直到它不匹配?如果每一种可能的解决方案都会陷入无限循环呢?
将最后一个值增加一个随机数,而不是使用随机值。像这样:
$results = mysql_query("SELECT * FROM thetable ORDER BY theId DESC LIMIT 1");
$keyToUse = 1;
if($row = mysql_fetch_array($results)) {
$keyToUse = (int)$row['theId'] + rand(1, 100);
}
的整数键,然后转换,并从任何格式,使用说base_convert
。
这就是我所做的。除了我添加了10个随机数字。我认为它不会很快重复。 – iosfreak 2011-05-21 03:03:35
使用md5 http://php.net/manual/en/function.md5.php 生成的字符串没有冲突(很可能)。
最好的办法是在写入一个包含该数字的新图像之前,通过在图像列表中使用随机数生成器来确保图像不存在。
尝试使用使用数字,字母的算法来增加字符的数量和类型,以增加可以使用的组合。
但是,这是否仍然存在多次获得相同结果的风险? – iosfreak 2011-05-21 01:49:08
如果你真的想永远不会有重复的数字,你可以按照数字的增加而不是随机数的顺序来计数,但如果你选择随机的方式,总会有一个偶然的机会。 – BRampersad 2011-05-21 02:34:59
这可能会引入竞争条件,如果两个进程竞相插入相同的值;两次检查都可以成功。 – MarkR 2011-05-21 06:22:32
你试过用mt_rand()
http://www.php.net/manual/en/function.mt-rand.php。你也应该增加范围。
通过您发布的代码,您只能拥有89999个数字串ID。不是很多。这些是否永久使用?还是你记得并回收它们? – 2011-05-21 02:24:42
问题:base_convert(string $ number,int $ frombase,int $ tobase)。我可能会错过一些东西,但不是你的基地,基地10而不是20? – 2011-05-21 02:42:28
@Mitch小麦:这正是我使用的代码。将基数从10变为20是做什么的? – iosfreak 2011-05-21 02:56:01