【问题标题】:Random string gets repeated?随机字符串被重复?
【发布时间】:2011-05-21 01:36:39
【问题描述】:

我在互联网上有一项服务,人们发布图片并生成一个短字符串。永远只能使用一个。但是,我在数据库中遇到了重复项,并且遇到了重大问题。

这是我正在使用的:

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

修复它的最佳方法是什么?从数据库中检查并继续循环直到它不匹配?如果每个可能的解决方案都进入一个无限循环怎么办?

【问题讨论】:

  • 根据您发布的代码,您只能拥有 89999 个数字字符串 ID。不是很多。这些是永久使用的吗?还是你记得并回收它们?
  • 问题:base_convert(string $number, int $frombase, int $tobase)。我可能遗漏了一些东西,但不是你的 frombase,base 10 而不是 20?
  • @Mitch Wheat:这正是我使用的代码。将基数从 10 更改为 20 有什么作用?

标签: php mysql uniqueidentifier base-conversion


【解决方案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

【讨论】:

  • 这正是我所做的。除了我添加了 10 个随机数。我认为它不会很快重复。
【解决方案2】:

将您的 PK 放入一个算法中,该算法从中生成一个唯一的数字并将其放入您的函数中。

【讨论】:

  • 我确实有每个图像的 ID。那我可以用它做点什么吗?就像生成像 md5 这样的特殊东西,但真的很短。我可能使用了错误的词汇,但你知道我的意思。记住:我需要尽量简短。
  • 将其补零为 8 位数字,反转数字,将其转回数字,然后转换。
  • 我明白你在说什么。您能否发布一个简短的示例或链接,我可以查看它以使其正常工作?
  • 这能保证我每次都能得到一个随机的吗?
【解决方案3】:

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

尝试通过使用数字、字母的算法来增加字符的数量和类型,从而增加您可以拥有的组合。

【讨论】:

  • 但这是否仍会使其面临多次获得相同结果的风险?
  • 如果您真的不希望有重复的数字,您可以按递增的数字而不是随机数的顺序进行计数,但如果您选择随机方式,则总会有重复的机会。跨度>
  • 如果两个进程竞相插入相同的值,这可能会引入竞争条件;两项检查都可能成功。
【解决方案4】:

您是否尝试过使用mt_rand() http://www.php.net/manual/en/function.mt-rand.php。你也应该增加范围。

【讨论】:

    【解决方案5】:

    使用 md5 http://php.net/manual/en/function.md5.php 产生的字符串没有冲突(大概率)。

    【讨论】:

    • 它需要对 URL 友好。 1-6 个字符长。
    • 您可以在第一部分使用 urlEncode,但我不确定是否只有 6 个字符。
    • 这是一个示例 URL:myflashpics.com/picture/8292 ... 我不能有 20 - 40 个字符的字符串。
    • 为什么不使用自动递增编号?真的需要随机性吗?
    • 我有。但我不希望用户可以访问它——我想要一个短字符串。
    猜你喜欢
    • 1970-01-01
    • 2020-05-13
    • 2010-12-07
    • 2011-12-08
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多