【问题标题】:MySQL, generate a random 42 character string for a columnMySQL,为一列生成一个随机的 42 个字符的字符串
【发布时间】:2013-10-01 18:40:27
【问题描述】:

我需要为表中的每一行的一列生成一个 42 个字符的字符串……它被用作密码恢复字符串。它必须是 42 个字符长,并且如果它是唯一的会很有帮助...

如果用户忘记密码,生成一个字符串。在一封电子邮件中,生成一个“abc123”字符串,我认为它执行以下操作:“SELECT FROM users WHERE recovery_string="abc123"

【问题讨论】:

  • 用作密码恢复字符串”是什么意思?你能详细说明吗?建议您阅读The definitive guide to form based website authentication,尤其是“第四部分:忘记密码功能”。
  • 为什么正好是 42 个字符?
  • 他的意思是如果用户忘记密码,生成一个字符串。在一封电子邮件中,生成一个“abc123”字符串,我认为它执行以下操作:“SELECT FROM users WHERE recovery_string="abc123" - 现在重置他们的密码......
  • 是的,正是……谢谢匿名。
  • @Anonymous2011:这就是我所担心的,但给了 OP 怀疑的好处。正如我所链接的文章中所解释的那样,这样做将是一个非常糟糕的主意

标签: mysql database string random


【解决方案1】:

如果您想在 MySQL 端执行此操作,您可以尝试使用SHA1(),方法是传递多个唯一列的连接结果。例如,idusernamedate(在创建帐户时)。它会为您生成一个长度为 40 个字符的唯一字符串。

UPDATE users 
   SET recovery_hash = SHA1(CONCAT(id, username, created));

这里是SQLFiddle演示

【讨论】:

    【解决方案2】:

    请看这段代码,我是专门为这个问题生成的。

    我敢肯定,这可能不是最好的方法,但这会奏效:

    Edit:变成了一个函数,所以你可以选择哪个长度。旧代码如下。

    新代码:

        <?php
    function GenerateRecoveryString($length)
    {
        $time=time();
        $az="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        //$time and $az is just random stuff to generate a hash out of. 
        $output = md5($time.$az);//The soon to be 42 char string.
        while(strlen($output)<$length)
        {
            $output.=md5($time.$az);//md5 only creates 32 bit strings - Lets create one that's 42 chars.
        }
        $output = substr($output, "0",$length);//The above example created 64 bit string - We need to cut it down.
        str_shuffle($az);//Randomize the string above, to ensure a different output next time.
        echo $output.' Length:'.strlen($output);
        }
        echo GenerateRecoveryString("42");
    ?>
    

    <?php
    $time=time();
    $az="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    //$time and $az is just random stuff to generate a hash out of. 
    $output = md5($time.$az);//The soon to be 42 char string.
    while(strlen($output)<"42")
    {
        $output.=md5($time.$az);//md5 only creates 32 bit strings - Lets create one that's 42 chars.
    }
    $output = substr($output, "0","42");//The above example created 64 bit string - We need to cut it down.
    str_shuffle($az);//Randomize the string above, to ensure a different output next time.
    echo $output.' Length:'.strlen($output);
    ?>
    

    【讨论】:

      猜你喜欢
      • 2013-05-20
      • 2017-04-05
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      • 2012-11-21
      • 2010-10-18
      相关资源
      最近更新 更多