Php 函数类似于MD5(),用于随机字符串生成(最好是加密安全的)

Php 函数类似于MD5(),用于随机字符串生成(最好是加密安全的),php,random,md5,Php,Random,Md5,目前正在进行一个PHP项目,我需要创建一个9个字符的键,最近遇到了MD5()函数,我知道它可以创建一个32个字符的随机化,但是有没有办法缩短它 是否有另一个函数可以进行长度较短的随机数和字母组合?不久前,我编写了一个小算法,用于连接类似的内容,但在将其注入代码时遇到了困难。ID应该是安全的,数据库将检查DUP。您可以查看uniqid() 您可以看看uniqid() 为什么不substr?例如: $code = substr(md5(time()), 0, 9); 为什么不substr?例如:

目前正在进行一个PHP项目,我需要创建一个9个字符的键,最近遇到了MD5()函数,我知道它可以创建一个32个字符的随机化,但是有没有办法缩短它


是否有另一个函数可以进行长度较短的随机数和字母组合?不久前,我编写了一个小算法,用于连接类似的内容,但在将其注入代码时遇到了困难。ID应该是安全的,数据库将检查DUP。

您可以查看uniqid()


您可以看看uniqid()


为什么不
substr
?例如:

$code = substr(md5(time()), 0, 9);

为什么不
substr
?例如:

$code = substr(md5(time()), 0, 9);

您可以直接或使用哈希函数使用系统的伪随机源:

//直接
echo substr(base64_编码(openssl_随机_伪_字节(7)),0,9);
//通过哈希函数
echo substr(base64_编码(sha1(openssl_随机_伪_字节(7),true)),0,9);
使用Base-64编码生成的输出空间为
64^9
,而
md5()
的输出空间仅为
16^9
(小25万倍)。这种编码的范围是
[A-Za-z0-9+/]
;您可以选择将
+
/
分别替换为
-

另见:

更新

您可以通过简单的转换从Base-64中删除
+
/

strtr($output, '/+', 'Zz');

它复制了两个字母,但在总体方案中,它对其唯一性几乎没有影响。

您可以直接使用系统的伪随机源,也可以使用哈希函数:

//直接
echo substr(base64_编码(openssl_随机_伪_字节(7)),0,9);
//通过哈希函数
echo substr(base64_编码(sha1(openssl_随机_伪_字节(7),true)),0,9);
使用Base-64编码生成的输出空间为
64^9
,而
md5()
的输出空间仅为
16^9
(小25万倍)。这种编码的范围是
[A-Za-z0-9+/]
;您可以选择将
+
/
分别替换为
-

另见:

更新

您可以通过简单的转换从Base-64中删除
+
/

strtr($output, '/+', 'Zz');

它复制了两个字母,但从总体上看,它对其唯一性几乎没有影响。

当您谈论创建随机字符串时,“安全”是不相关的。md5只返回十六进制字符;另一方面,b64编码的输出空间要大25万倍。“安全”与创建随机字符串无关。md5只返回十六进制字符;另一方面,b64编码的输出空间要大250k倍。我正在考虑这种方法。我只是对它需要的参数有点困惑。您将时间传递到md5中,md5给出随机数,然后substr获取0到9之间的字符?我读对了吗?是的,没错。它不会是加密安全的,因为没有哈希方法,但它足以生成id。你也可以在哈希中添加一个salt。我正在考虑这种方法。我只是对它需要的参数有点困惑。您将时间传递到md5中,md5给出随机数,然后substr获取0到9之间的字符?我读对了吗?是的,没错。它不会是加密安全的,因为没有散列方法,但它足以生成id。你也可以在散列中添加一个盐。另一个好主意。我对函数使用的前缀和参数有点困惑,但我会考虑它。PHP手册对它的加密安全性提出了一个很大的警告,但我逐渐了解到PHP中的random gen对于日常应用程序来说是非常安全的。这是另一个好主意。我对函数使用的前缀和参数有点困惑,但我会考虑它。PHP手册对它的加密安全性提出了一个很大的警告,但我逐渐了解到PHP中的random gen对于日常应用程序来说是非常安全的。Jack,谢谢你的反馈。我现在正在考虑使用这种方法。然而,有一个问题。是否有任何参数可以将结果过滤为字母数字?编辑:我在PHP手册中找到了convert_uencode方法。这行吗?@AndrewL你是说只有字母和数字吗?谢谢你的更新!:)我假设我们将substr设置为一个变量,并通过strtr方法传递该变量,使其成为一个两步过程?另外,我接受它,因为我们正在交换/和+不会有截断,字符串的长度仍然是9个字符?@AndrewL对,您可以在
base64\u encode()之后的任何点应用
strtr()
。。没关系。杰克,谢谢你的反馈。我现在正在考虑使用这种方法。然而,有一个问题。是否有任何参数可以将结果过滤为字母数字?编辑:我在PHP手册中找到了convert_uencode方法。这行吗?@AndrewL你是说只有字母和数字吗?谢谢你的更新!:)我假设我们将substr设置为一个变量,并通过strtr方法传递该变量,使其成为一个两步过程?另外,我接受它,因为我们正在交换/和+不会有截断,字符串的长度仍然是9个字符?@AndrewL对,您可以在
base64\u encode()之后的任何点应用
strtr()
。。没关系。