用php随机生成6位字符串,字符串为a-z,如何保证每次生成的唯一性,要绝对唯一,和以前的不会重复。

2013-03-26 00:05:52 +08:00
 soho176
14096 次点击
所在节点    程序员
7 条回复
Livid
2013-03-26 00:10:53 +08:00
这个可能会对你有用:

https://www.random.org/passwords/?num=5&len=6&format=plain&rnd=new

一个高质量的随机数来源。
soho176
2013-03-26 00:23:44 +08:00
@Livid 他这个原理是什么,直接访问获取的话 访问速度受限。
binux
2013-03-26 00:51:50 +08:00
一共26个字母,6位,越28bit
如果平均每秒生成一个,一年有31536000秒,越25bit
假如你算法足够完美,每秒生成一个,可以用十年,或者你用3bit空间用来防止一秒内重复

如果觉得时间不“随机”,设计一个映射函数,让它看起来随机即可
soho176
2013-03-26 01:27:24 +08:00
@binux 关键是想一次就生成几百万个。
binux
2013-03-26 09:39:56 +08:00
@soho176 一次?那简单了,随机洗牌,取前几百万个就完了。
soho176
2013-03-26 12:15:17 +08:00
@binux 随机洗牌是用在 数字的吧,6位字符串的这个可以吗?
Sunyanzi
2013-03-26 13:39:03 +08:00
<?php
$letters = range( 'a', 'z' );
$big_array = [];

$generator = function( $str = '', $depth = 0 )
use ( &$generator, &$big_array, $letters ) {
++ $depth;
if ( 7 === $depth ) {
$big_array[] = $str;
return;
}
foreach( $letters as $letter )
$generator( $str . $letter, $depth );

};

$generator();

shuffle( $big_array );

$ret = array_slice( $big_array, 0, 1000000 );


用随机洗牌的思路给你简要写了一个 ... 初步判断生成完毕大概要花几个小时的样子 ...

这个只是为了演示说办法可行 ... 更好的解决方案如下 ...

<?php
$letters = range( 'a', 'z' );

$generator = function() use ( $letters ) {
$ret = '';
for ( $i = 0; $i < 6; ++ $i )
$ret .= $letters[mt_rand( 0, 25 )];
return $ret;
};

$buffer = [];

for ( $i = 0; $i < 1000000; ++ $i ) {
$current = $generator();
if ( ! isset( $buffer[$current] ) )
$buffer[$current] = 0;
else -- $i;
}

$ret = array_keys( $buffer );

生成一百万的话应该也要十几分钟 ...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/64025

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX