검증 링크에 사용할 숫자와 문자를 사용하여 임의의 고유한 문자열을 생성하는 것이 어떻게 가능할까요? 예를 들어, 웹 사이트에 계정을 만들면 링크가 포함된 전자 메일을 보내는데, 계정을 확인하려면 해당 링크를 클릭해야 합니다.네, 그 중 하나죠
PHP를 사용하여 이러한 항목 중 하나를 생성하려면 어떻게 해야 합니까?
업데이트: ['uniqid()][1]에 대해 방금 생각났어요. 현재 시간(마이크로초)을 기준으로 고유 식별자를 생성하는 PHP 기능입니다. 저는 그것을 사용할 것 같아요.
난 그냥 어떻게 해결할 것인지를 살펴보는 것도 이 같은 문제를 만들 수 있지만, 난 또 내 기능을 사용할 수 있는 스맥랜드의 증표지 암호란이 읽어들이기가 잘 알려져 있다. 즉, 내가 할 수 있는 토큰인지 막 제한할 수 있다. ['유니키드'] 때문에 (http://php.net/uniqid) 는 시간을 기준으로 따르면 " (php.net) 에서, 반환 값은 큰 차이가 없는 마이크로타임 (), ',' 유니키드 " 기준과 않습니다. &Lt openssl_random_pseudo_bytes (), php, code> < /code>, 사용하는 것이 좋습니다. 대신 암호학적으로 안전한 토큰을 생성할 수 있습니다.
짧고 빠른 점, 그 답을 찾을 수 있습니다.
bin2hex(openssl_random_pseudo_bytes($bytes))
임의의 문자열 영숫자를 생성될 수 있는 길이 = $ 바이트입니다 * 2. [A-f] [0-9] '의 알파벳' 이 있는 죄송합니다. 대뿐입니다 있지만 작동하잖아. < 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 << $bits) - 1; // set all lower bits to 1
do {
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
$rnd = $rnd & $filter; // discard irrelevant bits
} while ($rnd > $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'.
< b> EDIT:< /b>;;; 출처 - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php # 104322 내가 꼽는 데 소홀히
(PHP 7), /b> :< 편집하십시오 b> <;; 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;
}
보안 알림: 이 솔루션은 임의성의 품질이 응용프로그램의 보안에 영향을 미칠 수 있는 상황에서는 사용하면 안 됩니다. 특히 randid와 uniqid는 암호적으로 안전한 난수 발생기가 아니다). 안전한 대안을 보려면 Scott'sanswer를 참조하십시오.
시간이 지남에 따라 완전히 고유할 필요가 없는 경우:
'md5(uniqid(rand(), true))`
그렇지 않은 경우(사용자의 고유한 로그인을 이미 결정한 경우):
md5(uniqid($your_user_login, true))
<?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 << $bits) - 1;
do {
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
// Discard irrelevant bits.
$rnd = $rnd & $filter;
} while ($rnd >= $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);
<! - 언어: > 랑 없음 -;
SRniGU2sRQb2K1ylXKnWwZr4HrtdRgrM
q1sRUjNq1K9rG905aneFzyD5IcqD4dlC
I0euIWffrURLKCCJZ5PQFcNUCto6cQfD
AKwPJMEM5ytgJyJyGqoD5FQwxv82YvMr
duoRF6gAawNOEQRICnOUNYmStWmOpEgS
sdHUkEn4565AJoTtkc8EqJ6cC4MLEHUx
eVywMdYXczuZmHaJ50nIVQjOidEVkVna
baJGt7cdLDbIxMctLsEBWgAw5BByP5V0
iqT0B2obq3oerbeXkDVLjZrrLheW4d8f
OUQYCny6tj2TYDlTuu1KsnUyaLkeObwa
누군가 데 도움이 될 것이라고 기대한다. 건배!
이 테스트 기간 동안 내가 사용한 5 가지 사이의길이 (5, 10, 15, 20, 50 개) 만 +/-0.5 각 레코드가 삽입됨 길이. 내 테스트 중 유일하게 길이 5 만 t # 39, 중복 아웃해야 +/-3K 생성할지 0.5, 나머지 모든 사이의길이 didn& 발령합니다 중복. 그래서 우리가 사용하는 경우 15 세 이상 말할 수 있는 길이 Scott& # 39 의 기능을 통해 안정적인 고유해야 써줬지 어졌다면 생성할 수 있습니다. 다음은 내 연구 데이터 테이블 있다.
이렇게 하면 좋겠다.
이 함수는 숫자와 문자를 사용하여 랜덤 키를 생성합니다.
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
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
이를 통해 향후 누군가가 바랍니다:)
아래 코드는 사용하여 난수 생성에 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);
예: (의사 코드)
int myInt = random(0, numcharacters)
char[] codealphabet = 'ABCDEF12345'
char random = codealphabet[i]
repeat until long enough
다음은 최고의 고유 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;
?>
감사합니다.
발령합니다 시도할 때 임의의 암호 노력하고 있습니다.
두 번째는 선반가공 cerner 임의적입니까 바이트입니다 붙여넣습니다 인쇄가능 문자열이어야 -
이제 다음과 같은 여러 가지 방법을 미리 발령합니다 임의적입니까 바이트입니다
$length = 32;
//PHP 7+
$bytes= random_bytes($length);
//PHP < 7
$bytes= openssl_random_pseudo_bytes($length);
그런 다음 매핑하려는 선반가공 이러한 임의적입니까 바이트입니다 붙여넣습니다 인쇄가능 구체화하십시오:
$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);
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();
}
}
Php 에서 문자열을 고유해야 생성하려면, 종료기 정보정의다음.
md5(uniqid().mt_rand());
이,
'유니키드 ()' - It 가 생성한 고유해야 구체화하십시오. 이 함수는 시간스탬프와 기반 고유해야 식별자입니다 비호환성의 구체화하십시오.
'mt_rand ()' - 난수 생성.
'md5 ()' - 생성하는 것 해시보다 구체화하십시오.
내가 읽은 후 이전 참조용이므로 한국증권선물거래소법을:
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] 와 다른 요소를 어레이이며 복제본임을 또는 그보다 더 추가할 수 있습니다, 나보다 더 창의적인
이는 단순한 생성할 수 있는 기능을 포함하는 무순서 문장열 문자와 숫자를 (문숫자). 문자열 길이를 제한할 수도 있습니다. 이러한 임의적입니까 문장열 등 다양한 용도로 사용할 수 있습니다. 추천 코드, 홍보 코드, 쿠폰 코드. 다음과 같은 함수 기반으로 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
*/
$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 점차로 만들려면 어떻게 만날 수 있다면 사용자 혼란을 이 토큰인지 수집됩니다;)
이를 통해 좋겠다:)