2011-05-21 55 views
0

我在互联网上有人发布图片和短字符串的服务生成。只有一个可以使用。但是,我正在进入数据库中的重复内容,并且看到重大问题。随机字符串重复吗?

下面是我在用的:

$id=rand(10000,99999); 
$short_string = base_convert($id,20,36); 

什么是解决它的最好方法?从数据库中检查并保持循环,直到它不匹配?如果每一种可能的解决方案都会陷入无限循环呢?

+0

通过您发布的代码,您只能拥有89999个数字串ID。不是很多。这些是否永久使用?还是你记得并回收它们? – 2011-05-21 02:24:42

+1

问题:base_convert(string $ number,int $ frombase,int $ tobase)。我可能会错过一些东西,但不是你的基地,基地10而不是20? – 2011-05-21 02:42:28

+0

@Mitch小麦:这正是我使用的代码。将基数从10变为20是做什么的? – iosfreak 2011-05-21 02:56:01

回答

1

将最后一个值增加一个随机数,而不是使用随机值。像这样:

$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

+0

这就是我所做的。除了我添加了10个随机数字。我认为它不会很快重复。 – iosfreak 2011-05-21 03:03:35

0

使用md5 http://php.net/manual/en/function.md5.php 生成的字符串没有冲突(很可能)。

+0

它需要是URL友好的。 1-6个字符长。 – iosfreak 2011-05-21 01:41:35

+0

您可以为第一部分用户urlEncode,但我不确定是否有强健的只有6个字符。 – 2011-05-21 01:42:54

+0

下面是一个示例URL:http://myflashpics.com/picture/8292 ...我不能有20-40个字符的字符串。 – iosfreak 2011-05-21 01:42:57

1

把你的PK通过一个算法,从它产生一个唯一的数字,并把它通过你的函数。

+0

链接?示例代码?谢谢... – iosfreak 2011-05-21 01:46:17

+0

我确实有每个图像的ID。那么我能做些什么吗?就像生成一些像md5一样特殊的东西,但真的很短。我可能会使用错误的词汇,但你知道我的意思。请记住:我需要尽可能保持简短。 – iosfreak 2011-05-21 01:47:49

+0

将它填零,例如8位数字,反转数字,将其转换回数字,然后将其转换。 – 2011-05-21 01:49:46

1

最好的办法是在写入一个包含该数字的新图像之前,通过在图像列表中使用随机数生成器来确保图像不存在。

尝试使用使用数字,字母的算法来增加字符的数量和类型,以增加可以使用的组合。

+0

但是,这是否仍然存在多次获得相同结果的风险? – iosfreak 2011-05-21 01:49:08

+0

如果你真的想永远不会有重复的数字,你可以按照数字的增加而不是随机数的顺序来计数,但如果你选择随机的方式,总会有一个偶然的机会。 – BRampersad 2011-05-21 02:34:59

+0

这可能会引入竞争条件,如果两个进程竞相插入相同的值;两次检查都可以成功。 – MarkR 2011-05-21 06:22:32