10) { $chars = $type == 'numeric' ? str_repeat($chars, $len) : str_repeat($chars, 5); } if ($type != 'chinese') { $chars = str_shuffle($chars); $str = substr($chars, 0, $len); } else { for ($i = 0; $i < $len; $i++) { $str .= mb_substr($chars, floor(mt_rand(0, mb_strlen($chars, 'utf-8') - 1)), 1); } } return $str; case 'unique': case 'md5': return md5(uniqid(mt_rand())); case 'encrypt': case 'sha1': return sha1(uniqid(mt_rand(), true)); } } /** * 根据数组元素的概率获得键名 * * @param array $ps array('p1'=>20, 'p2'=>30, 'p3'=>50); * @param int $num 默认为1,即随机出来的数量 * @param bool $unique 默认为true,即当num>1时,随机出的数量是否唯一 * @return array|int|int[]|string|string[] 当num为1时返回键名,反之返回一维数组 */ public static function lottery($ps, $num = 1, $unique = true) { if (!$ps) { return $num == 1 ? '' : []; } if ($num >= count($ps) && $unique) { $res = array_keys($ps); return $num == 1 ? $res[0] : $res; } $max_exp = 0; $res = []; foreach ($ps as $key => $value) { $value = substr($value, 0, stripos($value, ".") + 6); $exp = strlen(strchr($value, '.')) - 1; if ($exp > $max_exp) { $max_exp = $exp; } } $pow_exp = pow(10, $max_exp); if ($pow_exp > 1) { reset($ps); foreach ($ps as $key => $value) { $ps[$key] = $value * $pow_exp; } } $pro_sum = array_sum($ps); if ($pro_sum < 1) { return $num == 1 ? '' : []; } for ($i = 0; $i < $num; $i++) { $rand_num = mt_rand(1, $pro_sum); reset($ps); foreach ($ps as $key => $value) { if ($rand_num <= $value) { break; } else { $rand_num -= $value; } } if ($num == 1) { $res = $key; break; } else { $res[$i] = $key; } if ($unique) { $pro_sum -= $value; unset($ps[$key]); } } return $res; } /** * 生成随机用户名 * @return string */ public static function username(): string { return 'user_' . bin2hex(random_bytes(8)) . substr(uniqid(), -8); } /** * 获取全球唯一标识 * @param string $tag 标识 * @return string */ public static function uuid($tag = ''): string { return sprintf( '%04x%04x-%04x-%04x-%04x-%12s', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, substr(bin2hex(random_bytes(8)), 0, 6) . substr(md5(uniqid($tag ?: mt_rand(), true)), 0, 6) ); } }