【问题标题】:How to generate a unique digital id in PHP? [duplicate]如何在 PHP 中生成唯一的数字 id? [复制]
【发布时间】:2012-04-27 01:26:41
【问题描述】:

可能重复:
PHP: How to generate a random, unique, alphanumeric string?

这个公式会产生碰撞吗?

substr(md5(uniqid(rand()))),0,6)

如何生成只有数字(即 7 位)的唯一 ID?

【问题讨论】:

  • 如果你只想要数字并想避免冲突,唯一的方法是使用自动增量值。只要有足够的时间和足够大的样本,任何随机值都有可能发生冲突。
  • 在您的情况下,生成超过 1000 万个 ID 将产生 100% 的冲突 :)
  • 这个网站上的其他类似问题都没有任何帮助吗?
  • 重复的PHP: How to generate a random, unique, alphanumeric string? 回答以下问题:uniqid(rand()) 是否已经产生冲突?如果是,你的也会有这些碰撞。这个问题的答案是:Yes.
  • uniqid 生成一个 13 字符的字符串,如何减少到 7 字符或 7 位而不会有冲突的风险?

标签: php uniqueidentifier


【解决方案1】:

uniqid 生成一个 13 字符的字符串,如何将其减少到 7 字符或 7 位而不会有冲突的风险?

只要你的意思是在将uniqid 的输出转换为新的表示时发生碰撞,你可以像下面这样:

  • uniqid 返回一个 13 个字符的字符串,每个字符可以是 0-9a-f,所以基本上是一个十六进制数,一个位,十进制 0-15。
  • 如果您将其中两个可以转换为 0-255 范围内的一个字符或数字,那么将 13 个 0-15 值减少为 7 0-255 个值真的很容易:

例子:

 $unique = uniqid(); # 13 characters
 $sevenPairs = array_map('hexdec', str_split($unique, 2));
 printf("Unique ID: %s\nSeven Pairs (digits): %s\n"
        , $unique, implode(', ', $sevenPairs));

输出:

Unique ID: 4f8ace1eb736a
Seven Pairs (digits): 79, 138, 206, 30, 183, 54, 10

请注意,如果您使用前缀部分(在您的问题中使用rand),uniqid 返回的字符串的长度可能大于 13。

【讨论】:

  • 如果我为每个数字做 N mod 10 我得到一个介于 0 和 999999 之间的数字,但这个数字总是唯一的! ?
  • 我不明白你的意思。
  • 我想把你的七对变成七位数
  • 对我来说,数字是 ascii 0 到 ascii 9
【解决方案2】:

最简单的方法是从数据库或文本文件中获取它,从 0 开始并为每个 ID 递增 1。

$id = strint(file_get_contents('counter.txt'));
file_put_content('counter.txt',++$id);

当使用 rand() 时,你将有更大的机会获得相同的数字。 如果您不想要增量值,请使用 rand 并检查该数字是否已用于数据库。

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2015-09-22
    • 2012-06-24
    • 2014-05-02
    • 1970-01-01
    相关资源
    最近更新 更多