V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
soho176
V2EX  ›  程序员

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

  •  
  •   soho176 · 2013-03-26 00:05:52 +08:00 · 14104 次点击
    这是一个创建于 4265 天前的主题,其中的信息可能已经有所发展或是发生改变。
    7 条回复    1970-01-01 08:00:00 +08:00
    Livid
        1
    Livid  
    MOD
       2013-03-26 00:10:53 +08:00   ❤️ 1
    这个可能会对你有用:

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

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

    如果觉得时间不“随机”,设计一个映射函数,让它看起来随机即可
    soho176
        4
    soho176  
    OP
       2013-03-26 01:27:24 +08:00
    @binux 关键是想一次就生成几百万个。
    binux
        5
    binux  
       2013-03-26 09:39:56 +08:00
    @soho176 一次?那简单了,随机洗牌,取前几百万个就完了。
    soho176
        6
    soho176  
    OP
       2013-03-26 12:15:17 +08:00
    @binux 随机洗牌是用在 数字的吧,6位字符串的这个可以吗?
    Sunyanzi
        7
    Sunyanzi  
       2013-03-26 13:39:03 +08:00   ❤️ 1
    <?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 );

    生成一百万的话应该也要十几分钟 ...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5383 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 08:04 · PVG 16:04 · LAX 00:04 · JFK 03:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.