PHP: 어떻게 임의의 고유한 영숫자 문자열을 생성할 수 있습니까?

검증 링크에 사용할 숫자와 문자를 사용하여 임의의 고유한 문자열을 생성하는 것이 어떻게 가능할까요? 예를 들어, 웹 사이트에 계정을 만들면 링크가 포함된 전자 메일을 보내는데, 계정을 확인하려면 해당 링크를 클릭해야 합니다.네, 그 중 하나죠

PHP를 사용하여 이러한 항목 중 하나를 생성하려면 어떻게 해야 합니까?

업데이트: ['uniqid()][1]에 대해 방금 생각났어요. 현재 시간(마이크로초)을 기준으로 고유 식별자를 생성하는 PHP 기능입니다. 저는 그것을 사용할 것 같아요.

[1]http://php.net/uniqid

질문에 대한 의견 (3)

난 그냥 어떻게 해결할 것인지를 살펴보는 것도 이 같은 문제를 만들 수 있지만, 난 또 내 기능을 사용할 수 있는 스맥랜드의 증표지 암호란이 읽어들이기가 잘 알려져 있다. 즉, 내가 할 수 있는 토큰인지 막 제한할 수 있다. ['유니키드'] 때문에 (http://php.net/uniqid) 는 시간을 기준으로 따르면 &quot (php.net) 에서, 반환 값은 큰 차이가 없는 마이크로타임 (), ',' 유니키드 &quot 기준과 않습니다. &Lt openssl_random_pseudo_bytes (), php, code&gt &lt /code&gt, 사용하는 것이 좋습니다. 대신 암호학적으로 안전한 토큰을 생성할 수 있습니다.

짧고 빠른 점, 그 답을 찾을 수 있습니다.

bin2hex(openssl_random_pseudo_bytes($bytes))

임의의 문자열 영숫자를 생성될 수 있는 길이 = $ 바이트입니다 * 2. [A-f] [0-9] '의 알파벳' 이 있는 죄송합니다. 대뿐입니다 있지만 작동하잖아. &lt hr>; 다음은 내가 할 수 있다는 강력한 기준을 만족시키는 함수 (즉, 구축됩니까 버전니다 Erik& # 39 의 답).

function crypto_rand_secure($min, $max)
{
    $range = $max - $min;
    if ($range < 1) return $min; // not so random...
    $log = ceil(log($range, 2));
    $bytes = (int) ($log / 8) + 1; // length in bytes
    $bits = (int) $log + 1; // length in bits
    $filter = (int) (1  $range);
    return $min + $rnd;
}

function getToken($length)
{
    $token = "";
    $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
    $codeAlphabet.= "0123456789";
    $max = strlen($codeAlphabet); // edited

    for ($i=0; $i < $length; $i++) {
        $token .= $codeAlphabet[crypto_rand_secure(0, $max-1)];
    }

    return $token;
}

'crypto_rand_secure ($ $ 최소, 최대)' 에 대한 교체품을 작동하여 드롭합니다 '랜드 ()' 또는 'mt_rand'. It 는 난수를 생성할 수 있도록 openssl_random_pseudo_bytes 사이에 막스야) 과 $ $

한글을 사용할 수 있는 '그레토켄 ($ 길이)' 는 '$ 길이 내 길이 문자열으로 토큰인지 그리곤요 tcpg'.

&lt b&gt EDIT:&lt /b>;;; 출처 - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php # 104322 내가 꼽는 데 소홀히

(PHP 7), /b&gt :&lt 편집하십시오 b&gt <;; Php 7 출시와 함께 새로운 기능을 대체할 수 있는 지금, 표준 라이브러리 함수 / 개선 / 간편해집니다 crypto_rand_secure 는 2 위. 'random_bytes ($ 길이)' 와 'random_int ($ $ 최소, 최대)'

http://php.net/manual/en/function.random-bytes.php

http://php.net/manual/en/function.random-int.php

예:

function getToken($length){
     $token = "";
     $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
     $codeAlphabet.= "0123456789";
     $max = strlen($codeAlphabet); // edited

    for ($i=0; $i < $length; $i++) {
        $token .= $codeAlphabet[random_int(0, $max-1)];
    }

    return $token;
}
해설 (31)
해결책

보안 알림: 이 솔루션은 임의성의 품질이 응용프로그램의 보안에 영향을 미칠 수 있는 상황에서는 사용하면 안 됩니다. 특히 randid와 uniqid는 암호적으로 안전한 난수 발생기가 아니다). 안전한 대안을 보려면 Scott'sanswer를 참조하십시오.

시간이 지남에 따라 완전히 고유할 필요가 없는 경우:

'md5(uniqid(rand(), true))`

그렇지 않은 경우(사용자의 고유한 로그인을 이미 결정한 경우):

md5(uniqid($your_user_login, true))
해설 (6)

객체중심형 가장 최대 투표 솔루션이므로 버전니다.

  • # 39, ve i& 만들어 객체중심형 기반으로 솔루션을 Scott 39 에 대답:

<?php

namespace Utils;

/**
 * Class RandomStringGenerator
 * @package Utils
 *
 * Solution taken from here:
 * http://stackoverflow.com/a/13733588/1056679
 */
class RandomStringGenerator
{
    /** @var string */
    protected $alphabet;

    /** @var int */
    protected $alphabetLength;

    /**
     * @param string $alphabet
     */
    public function __construct($alphabet = '')
    {
        if ('' !== $alphabet) {
            $this->setAlphabet($alphabet);
        } else {
            $this->setAlphabet(
                  implode(range('a', 'z'))
                . implode(range('A', 'Z'))
                . implode(range(0, 9))
            );
        }
    }

    /**
     * @param string $alphabet
     */
    public function setAlphabet($alphabet)
    {
        $this->alphabet = $alphabet;
        $this->alphabetLength = strlen($alphabet);
    }

    /**
     * @param int $length
     * @return string
     */
    public function generate($length)
    {
        $token = '';

        for ($i = 0; $i < $length; $i++) {
            $randomKey = $this->getRandomInteger(0, $this->alphabetLength);
            $token .= $this->alphabet[$randomKey];
        }

        return $token;
    }

    /**
     * @param int $min
     * @param int $max
     * @return int
     */
    protected function getRandomInteger($min, $max)
    {
        $range = ($max - $min);

        if ($range < 0) {
            // Not so random...
            return $min;
        }

        $log = log($range, 2);

        // Length in bytes.
        $bytes = (int) ($log / 8) + 1;

        // Length in bits.
        $bits = (int) $log + 1;

        // Set all lower bits to 1.
        $filter = (int) (1 = $range);

        return ($min + $rnd);
    }
}

사용

<?php

use Utils\RandomStringGenerator;

// Create new instance of generator class.
$generator = new RandomStringGenerator;

// Set token length.
$tokenLength = 32;

// Call method to generate random string.
$token = $generator->generate($tokenLength);

사용자 정의 문자

사용자 정의 문자 필요한 경우 사용할 수 있습니다. 그냥 지나칠 수 있는 자 또는 setter 를 지원하는 문자열으로 구성자를.

<?php

$customAlphabet = '0123456789ABCDEF';

// Set initial alphabet.
$generator = new RandomStringGenerator($customAlphabet);

// Change alphabet whenever needed.
$generator->setAlphabet($customAlphabet);

# 39 의 출력물에는 샘플링합니다 Here&

<! - 언어: &gt 랑 없음 -;

SRniGU2sRQb2K1ylXKnWwZr4HrtdRgrM
q1sRUjNq1K9rG905aneFzyD5IcqD4dlC
I0euIWffrURLKCCJZ5PQFcNUCto6cQfD
AKwPJMEM5ytgJyJyGqoD5FQwxv82YvMr
duoRF6gAawNOEQRICnOUNYmStWmOpEgS
sdHUkEn4565AJoTtkc8EqJ6cC4MLEHUx
eVywMdYXczuZmHaJ50nIVQjOidEVkVna
baJGt7cdLDbIxMctLsEBWgAw5BByP5V0
iqT0B2obq3oerbeXkDVLjZrrLheW4d8f
OUQYCny6tj2TYDlTuu1KsnUyaLkeObwa

누군가 데 도움이 될 것이라고 기대한다. 건배!

해설 (5)

39 m, m 이 좋은 말, 그러나 I& i& # 39 와 일부 연구 데이터를 제공하는 기능에 따라 Scott& # 39 의 오토메이티드. 그래서 저는 그냥 긴 자동화된 테스트 및 디지털 오션 드롭릿 설정되었습니다 엔드입니다 생성된 고유해야 문장열 받을시간은 MySQL 데이터베이스에 저장된 5 일.

이 테스트 기간 동안 내가 사용한 5 가지 사이의길이 (5, 10, 15, 20, 50 개) 만 +/-0.5 각 레코드가 삽입됨 길이. 내 테스트 중 유일하게 길이 5 만 t # 39, 중복 아웃해야 +/-3K 생성할지 0.5, 나머지 모든 사이의길이 didn& 발령합니다 중복. 그래서 우리가 사용하는 경우 15 세 이상 말할 수 있는 길이 Scott& # 39 의 기능을 통해 안정적인 고유해야 써줬지 어졌다면 생성할 수 있습니다. 다음은 내 연구 데이터 테이블 있다.

! [입력하십시오. 이미지 여기에 설명을] [2]

이렇게 하면 좋겠다.

해설 (0)

이 함수는 숫자와 문자를 사용하여 랜덤 키를 생성합니다.

function random_string($length) {
    $key = '';
    $keys = array_merge(range(0, 9), range('a', 'z'));

    for ($i = 0; $i < $length; $i++) {
        $key .= $keys[array_rand($keys)];
    }

    return $key;
}

echo random_string(50);

출력 예:

zsd16xzv3jsytnp87tk7ygv73k8zmr0ekh6ly7mxaeyeh46oe8
해설 (2)

Uuid 를 사용할 수 있습니다 (범용 고유 식별자) 에서, 어떤 목적으로, 사용자 인증 결제 트랜잭션 id 문자열을 사용할 수 있습니다.

Uuid 가 는 16 옥텟 (128-비트) 번호. 이 표준 형식, uuid 가 나타내는 32tb 진수 숫자, 표시되려면 형식으로 총 5 개 그룹으로 구분해서 하이픈, 8-4-4-4-12 36tb 문자 (32tb 영문자와 4 개의 하이픈).

function generate_uuid() {
    return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
        mt_rand( 0, 0xffff ),
        mt_rand( 0, 0x0C2f ) | 0x4000,
        mt_rand( 0, 0x3fff ) | 0x8000,
        mt_rand( 0, 0x2Aff ), mt_rand( 0, 0xffD3 ), mt_rand( 0, 0xff4B )
    );

}

//calling 하여 장소

$transationID = generate_uuid();

출력입니다 다음과 같은 것입니다.

E302D66D-87E3-4450-8CB6-17531895BF14
22D288BC-7289-442B-BEEA-286777D559F2
51B4DE29-3B71-4FD2-9E6C-071703E1FF31
3777C8C6-9FF5-4C78-AAA2-08A47F555E81
54B91C72-2CF4-4501-A6E9-02A60DCBAE4C
60F75C7C-1AE3-417B-82C8-14D456542CD7
8DE0168D-01D3-4502-9E59-10D665CEBCB2

이를 통해 향후 누군가가 바랍니다:)

해설 (1)

내가 본 한 줄 광고문:

base64_encode(openssl_random_pseudo_bytes(3 * ($length >> 2)));

여기서 길이는 필요한 문자열 (수, 그렇지 않으면 4 로 get down to the nearest 번호임 수 라운드된 의해 4)

해설 (2)

아래 코드는 사용하여 난수 생성에 11 자 또는 변경 요구 사항에 따라 할 수 있다.

$randomNum=substr(str_shuffle("0123456789abcdefghijklmnopqrstvwxyz"), 0, 11);

사용자 정의 함수 또는 임의의 숫자를 생성할 수 있습니다.

 function randomNumber($length){
     $numbers = range(0,9);
     shuffle($numbers);
     for($i = 0;$i < $length;$i++)
        $digits .= $numbers[$i];
     return $digits;
 }

 //generate random number
 $randomNum=randomNumber(11);
해설 (2)
  1. 다음 명령을 사용하여 난수 생성 당신이 좋아하는 난수 발전기
  2. 곱하고 나누다 숫자와 일치하는 숫자를 얻다 코드 알파벳에 있는 문자들의
  3. 해당 인덱스에서 항목을 가져옵니다. 당신의 암호 알파벳.
  4. 길이가 될 때까지 1)부터 반복한다. 원하다

예: (의사 코드)

int myInt = random(0, numcharacters)
char[] codealphabet = 'ABCDEF12345'
char random = codealphabet[i]
repeat until long enough
해설 (1)

다음은 최고의 고유 id 발생기입니다 당신꺼에요. 나를 만들었다.

<?php
$d=date ("d");
$m=date ("m");
$y=date ("Y");
$t=time();
$dmt=$d+$m+$y+$t;    
$ran= rand(0,10000000);
$dmtran= $dmt+$ran;
$un=  uniqid();
$dmtun = $dmt.$un;
$mdun = md5($dmtran.$un);
$sort=substr($mdun, 16); // if you want sort length code.

echo $mdun;
?>

39, & # 39 모든 var& 에코 수 있습니다. 단축시킵니다 id 를 좋아해요. 그러나 md5, sha1 을 위한 것이 아니라, 더 나은 코드 $ 마던 바꿀 수 있습니다) 가 잘 될 수 있는 매우 긴 너회들 필요는 없지 않습니다.

감사합니다.

해설 (2)

발령합니다 시도할 때 임의의 암호 노력하고 있습니다.

  • 먼저 생성 집합을 암호학적으로 안전한 무순서 바이트입니다

두 번째는 선반가공 cerner 임의적입니까 바이트입니다 붙여넣습니다 인쇄가능 문자열이어야 -

이제 다음과 같은 여러 가지 방법을 미리 발령합니다 임의적입니까 바이트입니다

$length = 32;

//PHP 7+
$bytes= random_bytes($length);

//PHP < 7
$bytes= openssl_random_pseudo_bytes($length);

그런 다음 매핑하려는 선반가공 이러한 임의적입니까 바이트입니다 붙여넣습니다 인쇄가능 구체화하십시오:

    • Bin2hex 사용할 수 있습니다.
$string = bin2hex($bytes);

또는 base64_encode :

$string = base64_encode($bytes);

하지만 원하지 않는 제어입니다 사용하는 경우 끈의 길이에 base64.

  • 발쿰치로 붙여넣습니다 32 바이트입니다 bin2hex 사용할 수 있습니다, 이를 사용하여 64 챨 구체화하십시오 . 그래서 할 수 있는 것 같이 일하는 디렉토리에만 * 구체화하십시오.

    • 그냥 실행할 수 있도록 할 수 있습니다.
$length = 32;

if(PHP_VERSION>=7){
    $bytes= random_bytes($length);
}else{
    $bytes= openssl_random_pseudo_bytes($length);
} 

$string = bin2hex($bytes);
해설 (0)

그게 바로 제가 여기 있습니다.

md5(time() . rand());    
// Creates something like 0c947c3b1047334f5bb8a3b7adc1d97b
해설 (0)

정말 임의적입니까 문장열 위해 사용할 수 있습니다.

<?php

echo md5(microtime(true).mt_Rand());

출력:

40a29479ec808ad4bcff288a48a25d5c

그래서 심지어 발령합니다 문자열이어야 시도할 경우 정확한 시간에 동시에 여러 다른 출력 얻을 수 있습니다.

해설 (0)
function random_string($length = 8) {
    $alphabets = range('A','Z');
    $numbers = range('0','9');
    $additional_characters = array('_','=');
    $final_array = array_merge($alphabets,$numbers,$additional_characters);
       while($length--) {
      $key = array_rand($final_array);

      $password .= $final_array[$key];
                        }
  if (preg_match('/[A-Za-z0-9]/', $password))
    {
     return $password;
    }else{
    return  random_string();
    }

 }
해설 (0)

해시 키를 사용하여 처리할 때 모든검증 링크 싶어요. 난 이후 마이크로타임 사용 권장 및 MD5 해시 사용하는 것이 있어야 하는 이유도 이 때문에 기반한 마이크로타임 해시 시동키는 동일해야 합니다.

md5 (랜드 (), 키 = 1, $, code&gt &lt. &lt /code>; md5 (마이크로타임 (), 2., 키 = $ &lt code&gt &lt /code>;

해설 (0)

Php 에서 문자열을 고유해야 생성하려면, 종료기 정보정의다음.

md5(uniqid().mt_rand());

이,

'유니키드 ()' - It 가 생성한 고유해야 구체화하십시오. 이 함수는 시간스탬프와 기반 고유해야 식별자입니다 비호환성의 구체화하십시오.

'mt_rand ()' - 난수 생성.

'md5 ()' - 생성하는 것 해시보다 구체화하십시오.

해설 (0)

내가 읽은 후 이전 참조용이므로 한국증권선물거래소법을:

protected static $nonce_length = 32;

public static function getNonce()
{
    $chars = array();
    for ($i = 0; $i < 10; $i++)
        $chars = array_merge($chars, range(0, 9), range('A', 'Z'));
    shuffle($chars);
    $start = mt_rand(0, count($chars) - self::$nonce_length);
    return substr(join('', $chars), $start, self::$nonce_length);
}

내가 복제본임을 10 배 어레이입니다 [0-9, A-Z] 와 무순서 요소, 이후 추가 & # 39 I get a 임의적입니까 substr () 에 대한 시작점 creative& # 39;; ) [a-z] 와 다른 요소를 어레이이며 복제본임을 또는 그보다 더 추가할 수 있습니다, 나보다 더 창의적인

해설 (0)

이는 단순한 생성할 수 있는 기능을 포함하는 무순서 문장열 문자와 숫자를 (문숫자). 문자열 길이를 제한할 수도 있습니다. 이러한 임의적입니까 문장열 등 다양한 용도로 사용할 수 있습니다. 추천 코드, 홍보 코드, 쿠폰 코드. 다음과 같은 함수 기반으로 PHP 기능: , 유니키드 mt_rand base_convert sha1,

function random_code($length)
{
  return substr(base_convert(sha1(uniqid(mt_rand())), 16, 36), 0, $length);
}

echo random_code(6);

/*sample output
* a7d9e8
* 3klo93
*/
해설 (0)

39 를 사용하여 내 프로젝트 중 하나로, 어떤 I& 슬라이드에서는 it& # 39 m, s, a 고유해야 apc® 멋지구리해요 및 it 생성하는지 무순서 토큰인지 :

$timestampz=time();

function generateRandomString($length = 60) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

$tokenparta = generateRandomString();

$token = $timestampz*3 . $tokenparta;

echo $token;

유념하십시오 내가 여러배의 타임스탬프와 3 점차로 만들려면 어떻게 만날 수 있다면 사용자 혼란을 이 토큰인지 수집됩니다;)

이를 통해 좋겠다:)

해설 (2)

내 생각에 이것은 가장 좋은 방법은 사용할 수 있습니다.

str_shuffle(md5(rand(0,100000)))
해설 (0)