我需要为表中的每一行的一列生成一个 42 个字符的字符串……它用作密码恢复字符串。它必须是 42 个字符长,如果它是唯一的,将会很有帮助......
如果用户忘记密码,则生成一个字符串。在一封电子邮件中,生成一个“abc123”字符串,我认为它执行以下操作:“SELECT FROM users WHERE recovery_string="abc123"
请看这段代码,我已经为这个问题生成了它。
我敢肯定,这可能不是最好的方法,但这会起作用:
编辑:变成了一个函数,所以你可以选择哪个长度。旧代码如下。
新代码:
<?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);
?>
如果您想在 MySQL 端执行此操作,您可以尝试SHA1()
通过传递多个唯一列的连接结果来使用。例如id
,username
创建date
帐户的时间。它将为您生成一个长度为 40 个字符的唯一字符串。
UPDATE users
SET recovery_hash = SHA1(CONCAT(id, username, created));
这是SQLFiddle演示