2

可能重复:
PHP:如何生成随机、唯一的字母数字字符串?

这个公式会产生碰撞吗?

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

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

4

2 回答 2

2

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),则返回的字符串的长度 byuniqid可以大于 13。

于 2012-04-15T13:38:00.310 回答
0

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

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

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

于 2012-04-15T12:20:55.500 回答