在 PHP 中生成 4 到 8 个字符的随机字符串

2022-08-30 18:11:15

我需要使用PHP生成一个字符串,它需要是唯一的,并且需要4到8个字符(变量的值)。

我以为我可以使用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);

你认为我会在很长一段时间内每次都得到唯一的字符串吗?


答案 1

简而言之,我认为你会得到一个非常好的随机值。总是有发生碰撞的机会,但你已经尽了一切努力来获得一个随机值。uniqid() 返回一个基于当前时间(以微秒为单位)的随机值。指定 rand() (mt_rand() 会更好),第二个参数为 true to uniqid() 应该使值更加唯一。使用 md5() 对值进行哈希处理也应该使其非常独特,因为即使生成的两个随机值中的微小差异也应该通过哈希函数放大。idealmachine是正确的,因为较长的值比较短的值更不容易发生碰撞。

您的函数也可以更短,因为 md5() 将始终返回一个 32 个字符长的字符串。试试这个:

function unique_id($l = 8) {
    return substr(md5(uniqid(mt_rand(), true)), 0, $l);
}

答案 2

随机性的问题在于,你永远无法确定任何事情。这次您很有可能得到一个数字,下一次得到相同的数字。也就是说,您可能希望使字符串尽可能长,以减少该概率。作为此类数字可以有多长的示例,GUID(全局唯一标识符)的长度为 16 个字节。

从理论上讲,四个十六进制字符(16 位)仅给出 16^4 = 65536 种可能性,而八个十六进制字符(32 位)给出 16^8 = 4294967296。但是,您需要考虑任何两个哈希值发生碰撞的可能性(“生日问题”)。维基百科有一个很好的表格,说明这种碰撞的可能性有多大。简而言之,四个十六进制字符绝对是不够的,八个可能还不够。

您可能需要考虑使用Base64编码而不是十六进制数字;这样,您可以容纳48位,而不仅仅是32位。

8 个字节是 8 * 8 = 64 位。


推荐