在PHP中生成4到8个字符的随机字符串
我需要使用PHP生成一个字符串,需要是唯一的,需要是4到8个字符(变量的值)在PHP中生成4到8个字符的随机字符串,php,string,hash,random,unique,Php,String,Hash,Random,Unique,我需要使用PHP生成一个字符串,需要是唯一的,需要是4到8个字符(变量的值) 我想我可以使用crc32哈希,但我不能决定有多少个字符,但肯定它是唯一的。另一方面,仅创建一个“密码生成器”将生成重复的字符串,检查表中每个字符串的值将花费一些时间 我该怎么做 谢谢 也许我可以用这个: function unique_id(){ $better_token = md5(uniqid(rand(), true)); $unique_code = substr($better_token,
我想我可以使用crc32哈希,但我不能决定有多少个字符,但肯定它是唯一的。另一方面,仅创建一个“密码生成器”将生成重复的字符串,检查表中每个字符串的值将花费一些时间 我该怎么做 谢谢
也许我可以用这个:
function unique_id(){
$better_token = md5(uniqid(rand(), true));
$unique_code = substr($better_token, 16);
$uniqueid = $unique_code;
return $uniqueid;
}
$id = unique_id();
改为:
function unique_id($l = 8){
$better_token = md5(uniqid(rand(), true));
$rem = strlen($better_token)-$l;
$unique_code = substr($better_token, 0, -$rem);
$uniqueid = $unique_code;
return $uniqueid;
}
echo unique_id(4);
你认为我会在一段时间内每次都得到唯一的字符串吗?随机性的问题是你永远无法确定任何事情。有一个小机会,你可以得到一个号码,这一次和下一次相同的号码。也就是说,您希望使字符串尽可能长以减少这种可能性。例如,这些数字的长度为16字节 理论上,四个十六进制字符(16位)只给出16^4=65536的可能性,而八个十六进制字符(32位)给出16^8=4294967296的可能性。然而,你需要考虑任何两个散列碰撞的可能性(“生日问题”)。维基百科对这种冲突的可能性有一个明确的定义。简而言之,四个十六进制字符肯定不够,八个可能不够
您可能想考虑使用Base64编码而不是十六进制数字;这样,您就可以将48位输入,而不仅仅是32位
八个字节是8*8=64位。简而言之,我想你会得到一个非常好的随机值。碰撞的可能性总是存在的,但是您已经尽了一切努力来获得一个随机值。uniqid()返回基于当前时间的随机值(以微秒为单位)。将rand()指定为(mt_rand()会更好),并将第二个参数指定为true到uniqid()会使该值更加唯一。使用md5()对值进行散列也应该使其非常独特,因为即使生成的两个随机值之间的微小差异也应该通过散列函数放大。idealmachine是正确的,因为较长的值比较短的值发生碰撞的可能性更小 您的函数也可以更短,因为md5()将始终返回32个字符长的字符串。试试这个:
function unique_id($l = 8) {
return substr(md5(uniqid(mt_rand(), true)), 0, $l);
}
可靠的密码只能由ascii字符a-zA-Z和数字0-9生成。要做到这一点,最好的方法是只使用加密安全的方法,如PHP7中的random\u int()或random\u bytes()。Rest函数为base64_encode()您只能将其用作支持函数,以确保字符串的可靠性,并将其更改为ASCII字符 mt_rand()不安全,而且很旧。 对于任何字符串,必须使用random_int()。从二进制字符串中,您应该使用以使二进制字符串可靠或bin2hex,但随后您将只将字节剪切到16个位置(值)。
来自哪个字符集的字符?“检查表中每个字符串的值需要一段时间”-如果在该列上设置了唯一索引,则不会。然后,您只需检查插入是否有效,如果无效,则重新生成字符串并重试。但我不是说这是个好主意。视情况而定。@DanMan:是的,但如果我有1000000个条目,则生成一个字符串,直到找到一个唯一的:S。。。哈哈,但对于少量,我会记住这一点;)谢谢!如果您希望以加密方式将随机数据作为仅包含字母和数字的字符串进行安全保护,您可能希望使用。是的,但如何生成base64?关于Base64,我只知道我可以将mp3和图像转换成字符串,Firefox会显示它们:P(感谢数学课程!我热爱数学!XD{Really!})事实上,仔细看你发布的代码,你已经在使用带有原始输出选项的md5了,因此,我假设您的应用程序可以处理ASCII 0到255之间的任何字符(包括空字节)。如果这实际上是一个问题,那么您可以获取MD5的前六个字节,然后使用base64_encode()对它们进行编码。