0

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

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

4

2 回答 2

0

请看这段代码,我已经为这个问题生成了它。

我敢肯定,这可能不是最好的方法,但这会起作用:

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

新代码:

    <?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-09-26T00:39:56.627 回答
0

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

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

这是SQLFiddle演示

于 2013-09-26T00:44:44.020 回答