创建唯一的8位数字

时间:2019-10-02 07:58:53

标签: php laravel random hash

我现在正在创建一个应用程序,该应用程序需要为用户提供一个唯一的8位代码(仅数字),用户可以输入该代码来访问我的网站的受限部分,将其视为基本的身份验证,即输入密码,密码与用户匹配,则返回用户。我遇到的麻烦是创建一个唯一的8位代码。我知道PHP具有uniqid(),但是返回的字符串太长。

我曾考虑过创建time()和用户IP地址的哈希,但是laravel的Hash::create返回整数和字符。

有人可以指出创建随机8位代码的方向吗?我也尝试过mt_rand,但是很可能会产生匹配的数字,除非我当然在保存之前检查数据库中的代码并重新生成(如果存在)?

5 个答案:

答案 0 :(得分:1)

这是我的生成随机数的代码:

public function generateRandomNumber($length = 8)
{
  $random = "";
  srand((double) microtime() * 1000000);

  $data = "123456123456789071234567890890";
  // $data .= "aBCdefghijklmn123opq45rs67tuv89wxyz"; // if you need alphabatic also

  for ($i = 0; $i < $length; $i++) {
          $random .= substr($data, (rand() % (strlen($data))), 1);
  }

  return $random;

}

答案 1 :(得分:0)

您需要检入数据库是否存在该号码

$randnum = rand(11111111,99999999);

这将生成一个随机的8位数字

答案 2 :(得分:0)

尝试使用此功能对于 Laravel ,它还将返回8位数字,并且在db中具有唯一校验。

在控制器功能中

$expense_id = Expense::get_random_string();

模式

public static function get_random_string()
{
    if (function_exists('com_create_guid') === true)
    {
        return trim(com_create_guid(), '{}');
    }
    $random_unique  =  sprintf('%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));

    $expense = Expense::where('expense_id', '=', $random_unique)->first();
    if ($expense != null) {
        $random_unique = $this->get_random_string();
    }
    return $random_unique;
}

答案 3 :(得分:0)

我的建议是做一个do-while循环,这种情况下,如果随机字符串已经存在,它将生成一个新的字符串。生成所需的代码,但Laravel实际上有一个助手(str_random())来处理此代码。

/**
* Create a unique code
*
* @return string;
*/
if ( ! function_exists('generateUniqueCode')) {
    function generateUniqueCode()
    {
        do {
            $unique_code = str_random(12);
        } while (\App\User::where('code', $unique_code)->count() > 0);


        return $unique_code;
    }
}

答案 4 :(得分:0)

rand(10000000, 99999999);

您有1/89999999个机会落在同一数字上,因此可以检查它是否已被使用;)