【问题标题】:Generate random string from 4 to 8 characters in PHP在 PHP 中生成 4 到 8 个字符的随机字符串
【发布时间】:2023-03-13 14:56:01
【问题描述】:

我需要使用 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);

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

【问题讨论】:

  • 来自什么字符集的字符?
  • “检查表中每个字符串的值需要一段时间”- 如果您在该列上设置唯一索引,则不会。然后您只需要检查插入是否有效,如果没有,则重新生成字符串并重试。并不是说这是一个好主意。视情况而定。
  • @DanMan:是的,但是如果我有 1 000 000 个条目,请生成一个字符串,直到找到一个唯一的:S ... LOL 但对于少量,我会记住这一点;)非常感谢!
  • 如果您希望加密安全的随机数据作为仅包含字母和数字的字符串,您可能需要使用Random::alphanumericString($length)

标签: php string hash random unique


【解决方案1】:

简而言之,我认为你会得到一个相当不错的随机值。总是有发生碰撞的机会,但您已尽一切努力获得随机值。 uniqid() 根据当前时间返回一个随机值(以微秒为单位)。指定 rand() (mt_rand() 会更好)和第二个参数为真 uniqid() 应该使值更加独特。使用 md5() 散列值也应该使它非常独特,因为即使生成的两个随机值的微小差异也应该被散列函数放大。 Idealmachine 是正确的,因为较长的值比较短的值更不可能发生冲突。

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

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

【讨论】:

    【解决方案2】:

    随机性的问题是你永远无法确定任何事情。这次您获得一个号码而下一次获得相同号码的可能性很小。也就是说,您可能希望使字符串尽可能长以降低这种可能性。作为此类数字长度的示例,GUIDs (globally unique identifiers) 的长度为 16 个字节。

    理论上,四个十六进制字符(16 位)仅给出 16^4 = 65536 种可能性,而八个十六进制字符(32 位)给出 16^8 = 4294967296。但是,您需要考虑 any 两个哈希值冲突(“生日问题”)。维基百科有一个good table,说明这种碰撞的可能性有多大。简而言之,四个十六进制字符肯定不够,八个可能不够。

    您可能需要考虑使用 Base64 编码而不是十六进制数字;那样的话,你可以适应 48 位而不是 32 位。

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

    【讨论】:

    • 是的,但我如何生成 base64 ?关于 Base64,我唯一知道的是,我可以将 mp3 和图像转换为字符串,Firefox 会显示它们:P(感谢数学课程!我喜欢数学!XD {真的!})
    • 实际上,仔细查看您发布的代码,您已经在使用 md5 和 raw_output 选项,所以我假设您的应用程序可以使用 ASCII 0 到 255 的任何字符(包括 空字节)。如果这确实是个问题,那么您可以获取 MD5 的前 6 个字节,然后使用 base64_encode() 它们。
    【解决方案3】:

    可靠的密码 您只能使用 ascii 字符 a-zA-Z数字 0-9。要做到这一点,最好的方法是仅使用加密安全方法,例如 PHP7 中的 random_int()random_bytes()。其余函数为 base64_encode() 您只能将其用作支持函数以使字符串可靠并将其更改为 ASCII 字符。

    mt_rand() 不安全且非常旧。 从任何字符串您必须使用 random_int()。从二进制字符串你应该使用base64_encode() 使二进制字符串可靠或bin2hex,但是你只会将字节切割到16个位置(值)。 See my implementation of this functions.

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2010-12-01
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 2011-07-23
      • 2011-06-27
      相关资源
      最近更新 更多