পিএইচপি র্যান্ডম স্ট্রিং জেনারেটর


814

আমি পিএইচপিতে একটি এলোমেলোভাবে স্ট্রিং তৈরি করার চেষ্টা করছি এবং আমি এর সাথে একেবারে কোনও আউটপুট পাই না:

<?php
    function RandomString()
    {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randstring = '';
        for ($i = 0; $i < 10; $i++) {
            $randstring = $characters[rand(0, strlen($characters))];
        }
        return $randstring;
    }

    RandomString();
    echo $randstring;

আমি কি ভুল করছি?


241
সংক্ষিপ্ত স্ট্রিং উত্পন্ন করার জন্য আমার এক লাইন সমাধান হ'ল সাবস্ট্রাস্ট (এমডি 5 (র্যান্ড ()), 0, 7); শুভকামনা ...
তাসমানিস্কি

5
@ তাসমানিস্কি .. আপনার সমাধান ঠিক আছে .. তবে এর কম এলোমেলোভাবে! আপনার উদাহরণে সংখ্যার এলোমেলো স্ট্রিংগুলির সংখ্যা পূর্ণসংখ্যার আকারের দ্বারা সীমাবদ্ধ। সর্বোচ্চ (2 ^ 32) সর্বাধিক .. অন্য সমাধানের ক্ষেত্রে, আপনি উত্পন্ন করতে পারেন (62 ^ 8) .. যদি আমি বড় স্ট্রিং চাই, তবে পৃথক স্ট্রিংয়ের সংখ্যা সর্বোচ্চ 2 ^ 32 এ থাকুক, তবে অন্যান্য সমাধান এটি বেড়ে যায় (62 ^ n) ..
মানু

9
আপনি স্ট্রিংটিতে প্রতিটি নতুন উত্পন্ন অক্ষর যুক্ত করতে ভুলে গেছেন। আপনি এটিকে ঠিক যেমন ওভাররাইট করছেন। $ র্যান্ডস্ট্রিং। = $ অক্ষর হওয়া উচিত ..
স্পোক করুন

3
@ ক্যাপটেনলাইটিং আপনি কি আরও সুরক্ষিত উত্তরগুলির একটির জন্য গৃহীত উত্তরটি পরিবর্তন করতে পারেন? :)
স্কট আর্কিসজেউসকি

2
strlen($characters)=> strlen($characters) - 1- স্ট্রিংয়ের দৈর্ঘ্য 1
জিপ্প

উত্তর:


1393

এই প্রশ্নের বিশেষভাবে উত্তর দিতে, দুটি সমস্যা:

  1. $randstring আপনি যখন এটি প্রতিধ্বন করবেন তখন সুযোগের মধ্যে নেই।
  2. চরিত্রগুলি লুপের সাথে একত্রে মিলিত হচ্ছে না।

সংশোধন সহ একটি কোড স্নিপেট এখানে:

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

নীচে কল দিয়ে এলোমেলো স্ট্রিং আউটপুট:

// Echo the random string.
// Optionally, you can give it a desired string length.
echo generateRandomString();

দয়া করে নোট করুন যে এটি অনুমানযোগ্য এলোমেলো স্ট্রিং উত্পন্ন করে। আপনি যদি সুরক্ষিত টোকেন তৈরি করতে চান তবে এই উত্তরটি দেখুন


34
@ ফ্রেঞ্চিসকো প্রেনসেসিয়া, লুপের তুলনামূলক অবস্থায় কোনও পদ্ধতিটি কল করার জন্য এটি একটি অতিরিক্ত পরিবর্তনশীল "নষ্ট" করা ভাল better
রিকো সোনট্যাগ

200
এই সমস্ত কাজ, কেন শুধু কিছু না substr(str_shuffle(MD5(microtime())), 0, 10);?
SpYk3HH

4
কোডটির জন্য ধন্যবাদ, তবে দয়া করে এতে পরিবর্তন rand()করুন mt_rand()। আমি আপনার পদ্ধতিটি ব্যবহার করেছি এবং নাম সহ এক টন সংঘর্ষের অভিজ্ঞতা পেয়েছি ।
Nate

5
@ ফ্রেঞ্চিসকো প্রেনসেসিয়া আপনার কি ধারণা আছে যে এটি কতটা ভয়াবহভাবে অক্ষম? আপনি পুনরাবৃত্তির জন্য একটি স্ট্রিংয়ের দৈর্ঘ্য দুবার পরীক্ষা করছেন! লুপটির অভ্যন্তরে স্ট্রেনটি লুপটি প্রবেশ করার আগে একটি পরিবর্তনশীলে ক্যাশে করা উচিত।
developerbmw

4
এটি একটি ভাল সমাধান নয়। এই উত্পন্ন স্ট্রিংগুলি অনুমানযোগ্য হবে। :(
স্কট আর্কিসজেউসকি

370

দ্রষ্টব্য: str_shuffle()অভ্যন্তরীণভাবে ব্যবহার করে rand(), যা ক্রিপ্টোগ্রাফি উদ্দেশ্যে (উদাহরণস্বরূপ এলোমেলো পাসওয়ার্ড তৈরি করা) জন্য অনুপযুক্ত। পরিবর্তে আপনি একটি নিরাপদ র্যান্ডম নম্বর জেনারেটর চান । এটি অক্ষরগুলি পুনরাবৃত্তি করতে দেয় না।

আরও একটি উপায়।

আপডেট করা (এখন এটি স্ট্রিংয়ের কোনও দৈর্ঘ্য উত্পন্ন করে):

function generateRandomString($length = 10) {
    return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
}

echo  generateRandomString();  // OR: generateRandomString(24)

এটাই. :)


64
সংক্ষিপ্ত উত্তরের জন্য +1 :) তবে প্রতিটি ব্যবহারের ক্ষেত্রে সেরা উত্তর নয়। এই কোডটি স্ট্রিংগুলি আউটপুট দেবে যেখানে প্রতিটি অক্ষর একাধিকবার প্রদর্শিত হবে না (ফলে এটি নিষ্ঠুর বলের আক্রমণে দুর্বল হয়ে যায়) এবং characters২ টি অক্ষরের বেশি আউটপুট দেয় না।
ডেভিড

17
এটি করবেন না, এটি অত্যন্ত দুর্বল। আপনি যত বেশি আপনার এলোমেলো স্ট্রিং তৈরি করবেন তত দুর্বল হবে।
অভি বেকার্ট

23
দুর্বল এটি হতে পারে, তবে এটি দ্রুত এবং সহজ। ব্যবহারের ক্ষেত্রে নির্ভর করে এটি ঠিক আছে - আমি এটি ব্যবহার করেছি কারণ আমার সুরক্ষা বা শক্তি প্রয়োজন হয়নি; কেবলমাত্র একটি দ্রুত আগুন লাগল। আমি একটি ইউনিট পরীক্ষা লিখছি, এবং এটি আমাকে পরীক্ষার জন্য উপযুক্ত এলোমেলো ইনপুট দেয়।
এসডিসি

23
@ ফ্রানসিসকো প্রেনসিয়া এটি সুরক্ষিত না থাকার কারণ হ'ল এটি কখনও একই চরিত্রটি দু'বার ব্যবহার করে না। এটি এটিকে একটি ভয়ানক পাসওয়ার্ড জেনারেটর করে তোলে । সবাই দয়া করে এটির ভোট দেওয়া বন্ধ করুন, এটি পুরোপুরি অনিরাপদ is পাসওয়ার্ডটি লম্বা হওয়ার সাথে সাথে, আপনাকে অবশ্যই একটি বক্ষ জলে পরীক্ষা করতে হবে এমন অক্ষরের সংখ্যা সংক্ষিপ্ত হয়ে যায় কারণ আপনি আগে ব্যবহৃত ব্যবহৃত চরিত্রের পরীক্ষা করতে বিরত হন না।
অভি বেকার্ট

8
@ ফ্রেঞ্চিসকো প্রেনসেসিয়া: এলোমেলো পাসওয়ার্ডগুলির জন্য এটি ব্যবহার এড়ানো সম্পর্কে আমি আপনার মন্তব্যে সমর্থন করি। তবে, আমি একমত নই যে এই উত্তরটি প্লাস-ওয়ান হওয়া উচিত নয়। আমি এই বিকল্পটি প্লাস-ওয়ান করেছি কারণ এটি এলোমেলো স্ট্রিং উত্পন্ন করার জন্য একটি কার্যকর এক-লাইন সমাধান (এই প্রশ্নের মূল বিষয়)।
উজ্জ্বল

331

এই প্রশ্নের উত্তর অনেক আছে, কিন্তু তাদের কেউই ক্রিপ্টোগ্রাফিকভাবে সিকিউর সিউডো-র্যান্ডম নম্বর জেনারেটর (সিএসপিআরএনজি) ব্যবহার করেন না।

সহজ, সুরক্ষিত এবং সঠিক উত্তরটি হ'ল র্যান্ডমলিব ব্যবহার করা এবং চাকাটি পুনরায় উদ্ভাবন করা নয়।

আপনারা যারা নিজের সমাধান আবিষ্কার করার জন্য জিদ করেন, পিএইচপি 7.0.0 random_int()এই উদ্দেশ্যে সরবরাহ করবে; আপনি যদি এখনও পিএইচপি 5.x এ থাকেন তবে আমরা একটি পিএইচপি 5 পলিফিলrandom_int() লিখেছিলাম যাতে আপনি পিএইচপি 7 তে আপগ্রেড করার আগেই নতুন এপিআই ব্যবহার করতে পারেন।

নিরাপদে পিএইচপিতে এলোমেলো পূর্ণসংখ্যা উত্পন্ন করা তুচ্ছ কাজ নয়। আপনি উত্পাদনে কোনও বাড়ির বর্ধিত অ্যালগরিদম স্থাপন করার আগে আপনার সর্বদা আপনার আবাসিক স্ট্যাকএক্সচেঞ্জ ক্রিপ্টোগ্রাফি বিশেষজ্ঞদের সাথে যোগাযোগ করা উচিত ।

নিরাপদে পূর্ণসংখ্যার জেনারেটর স্থানে থাকা, সিএসপিআরএনজি দিয়ে একটি এলোমেলো স্ট্রিং তৈরি করা পার্কে হাঁটা।

একটি সুরক্ষিত, এলোমেলো স্ট্রিং তৈরি করা হচ্ছে

/**
 * Generate a random string, using a cryptographically secure 
 * pseudorandom number generator (random_int)
 *
 * This function uses type hints now (PHP 7+ only), but it was originally
 * written for PHP 5 as well.
 * 
 * For PHP 7, random_int is a PHP core function
 * For PHP 5.x, depends on https://github.com/paragonie/random_compat
 * 
 * @param int $length      How many characters do we want?
 * @param string $keyspace A string of all possible characters
 *                         to select from
 * @return string
 */
function random_str(
    int $length = 64,
    string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
): string {
    if ($length < 1) {
        throw new \RangeException("Length must be a positive integer");
    }
    $pieces = [];
    $max = mb_strlen($keyspace, '8bit') - 1;
    for ($i = 0; $i < $length; ++$i) {
        $pieces []= $keyspace[random_int(0, $max)];
    }
    return implode('', $pieces);
}

ব্যবহার :

$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');
$c = random_str();

ডেমো : https://3v4l.org/IMJGF (পিএইচপি 5 ব্যর্থতা উপেক্ষা করুন; এটি এলোমেলো_কম্প্যাট প্রয়োজন)


3
ফাংশনটির শুরুতে $keyspace = str_shuffle($keyspace );আরও সুরক্ষার জন্য যুক্ত করুন
জেভেনিজ দিমিত্রিজেভ

13
"আরও সুরক্ষার জন্য" বলতে কী বোঝ? আমরা ইতিমধ্যে একটি সুরক্ষিত র্যান্ডম নম্বর জেনারেটর ব্যবহার করছি।
স্কট আর্কিসজেউসকি

5
@ জেজিস্টিওট নিরাপদে র্যান্ডম স্ট্রিং তৈরি করতে ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত এলোমেলোতা প্রয়োজন। "পিএইচপি-র মধ্যে এলোমেলো স্ট্রিং কীভাবে উত্পন্ন করা যায়" সন্ধানকারী কেউ একজন সুরক্ষিত উত্তর দ্বারা সুরক্ষিত একটি সুরক্ষিত উত্তরের চেয়ে ভালভাবে পরিবেশন করেছেন।
স্কট আর্কিসজেউস্কি

1
@ স্কট আর্কিসজেউসকি প্রতিবার আপনি এলোমেলো স্ট্রিং তৈরি করার সময় আপনাকে ক্রিপ্টোগ্রাফিকভাবে এলোমেলো স্ট্রিং তৈরি করার দরকার নেই। প্রশ্নটি এলোমেলোভাবে স্ট্রিং তৈরি করার বিষয়ে ছিল এবং এটির সুরক্ষার সাথে কোনও সম্পর্ক নেই। আপনি ধরে নিয়েছেন যে স্ট্রিংটি সুরক্ষা-সংবেদনশীল প্রসঙ্গে ব্যবহৃত হবে এবং আপনি জটিলতার একটি স্তর যুক্ত করেন যা প্রশ্নের মূল থেকে বিরত থাকে।
জে জি Estiot

45
random_int()পরিবর্তে ব্যবহার করা rand()বা mt_rand()বিকাশকারীদের জন্য কোনও জটিলতা যুক্ত করে না। একই সাথে, এটি তাদের আরও বৃহত্তর সুরক্ষা দেয়। দ্রুত সমাধানের সন্ধানের জন্য স্ট্যাকওভারফ্লোতে আসা লোকেরা হয়ত জানেন না যে তারা যে জিনিসটি নির্মাণ করছেন সেটি সুরক্ষিত থাকা দরকার কিনা। যদি আমরা তাদের সুরক্ষিত বাই ডিফল্ট উত্তর দিই তবে তারা তাদের দৃষ্টিকোণ থেকে এটি সম্পূর্ণ দুর্ঘটনাক্রমে আরও সুরক্ষিত ইন্টারনেট তৈরি করে। আপনি কেন এই লক্ষ্যটির বিরোধিতা করবেন তা আমার কাছে একটি রহস্য।
স্কট আর্কিসজেউসকি 20

155

এটি একটি 20 টি অক্ষরের দীর্ঘ হেক্সাডেসিমাল স্ট্রিং তৈরি করে:

$string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars

পিএইচপি 7 এ ( এলোমেলো_বাইটস () ):

$string = base64_encode(random_bytes(10)); // ~14 characters, includes /=+
// or
$string = substr(str_replace(['+', '/', '='], '', base64_encode(random_bytes(32))), 0, 32); // 32 characters, without /=+
// or
$string = bin2hex(random_bytes(10)); // 20 characters, only 0-9a-f

দয়া করে নোট করুন যে openssl_random_pseudo_bytes()পিএইচপি 5.6 অবধি কোনও ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী অ্যালগরিদম ব্যবহার করেন নি। সম্পর্কিত বাগ: bugs.php.net/bug.php?id=70014
অ্যাসিডটিভি

এছাড়াও মনে রাখবেন ক্ষুদ্রতম স্ট্রিং এই করতে পারেন আপনি 1 বা একটি বাইট দৈর্ঘ্য কম পাস যদি দৈর্ঘ্য 2. হয় openssl_random_pseudo_bytes()তুমি কিছুই ফেরত পেতে হবে। এছাড়াও, মনে রাখবেন যখন ব্যবহার করে bin2hex(openssl_random_pseudo_bytes($length / 2))যেহেতু আপনি পূর্ণসংখ্যার সঙ্গে কাজ করছি, এটি স্বয়ংক্রিয়ভাবে মডিউল মুছে ফেলা হবে এবং 2. সুতরাং পরবর্তী সর্বনিম্ন একাধিক ব্যবহার করবে, $length = 19দৈর্ঘ্য 18 একটি স্ট্রিং উত্পাদন করা হবে
নাথন এফ

এটিকে ফাইলের সামগ্রী হিসাবে খোলা যেতে পারে fgets($fp, 1024)এবং প্রতিটি ফাইল সম্পাদক যে খুব দীর্ঘ লাইন নিয়ে সমস্যা রয়েছে তা হিসাবে ব্যবহার করার প্রস্তাব : এটি যদি একটি-লাইনার ফিরে আসে কিনা তা function string_rand($len, $split="\n") { return substr(chunk_split(bin2hex(openssl_random_pseudo_bytes(ceil($len / 2))), 1023, $split), 0, $len); }সেট করুন । এটি দ্বারা আপনি উভয় ক্ষেত্রে এটি ব্যবহার করতে পারেন। $splitnull
মিগ্লুট

আমি সত্যিই পিএইচপি 7 এর জন্য র্যান্ডম_বাইটস সমাধানটি পছন্দ করি, তবে আপনার যদি স্ট্রিংটির একটি নির্দিষ্ট সংখ্যক চরিত্রের প্রয়োজন হয় তবে এই কাজটির মতো কিছু হবে? $string = substr(base64_encode(random_bytes($size)), 0, $size);
প্রোগ্রামার

এটি নিঃসন্দেহে সর্বোত্তম সমাধান। খুব অল্প জায়গা নেয় এবং এটি বোঝা অত্যন্ত সহজ।
ম্যাথু ক্যাম্পবেল

92

@ তাসমানিস্কি: আপনার উত্তর আমার পক্ষে কাজ করেছে। আমারও একই সমস্যা ছিল এবং আমি তাদের জন্য পরামর্শ দেব যাঁরা সর্বদা একই উত্তর খুঁজছেন। এটি @ তাসমানিস্কি থেকে এসেছে:

<?php 
    $random = substr(md5(mt_rand()), 0, 7);
    echo $random;
?>

এখানে একটি ইউটিউব ভিডিও র্যান্ডম নম্বর কীভাবে তৈরি করবেন তা আমাদের দেখায়


6
যদি আপনার স্ট্রিংটি কেবল একটি এলোমেলো পূর্ণসংখ্যার উপর ভিত্তি করে থাকে তবে কেন কেবল এলোমেলো পূর্ণসংখ্যা ব্যবহার করবেন না? তারা খড়খড়ি এটি হ্যাশ করে আরও গভীর পেতে পারে না ... এবং আপনার হ্যাশ কেটে আসলে আপনি যে ছোট্ট এনট্রপিটি শুরু করেছিলেন তা নির্ধারণ করে।
সুরিকান

4
মনে রাখবেন md530 টি অক্ষরের সীমা এবং সর্বদা ছোট অক্ষরের ফলাফল হবে।
fyrye

3
অতিরিক্তভাবে, র্যান্ড () ক্রিপ্টোগ্রাফির জন্য ব্যবহার করা উচিত নয়। আপনি যদি ক্রিপোগ্রাফিকভাবে সাউন্ড স্ট্রিং তৈরি করতে দেখেন তবে ওপেনএসএল_আরন্ডম_পসিউডো_বাইটস ব্যবহার করুন
ম্যাটকগ্রস

md5(rand())শুধুমাত্র 2 ^ 32 সম্ভাব্য মান সরবরাহ করে। এর অর্থ হ'ল, গড়পড়তা 2 ^ 16 এলোমেলো স্ট্রিং আপনি প্রত্যাশা করবেন one
স্কট আর্কিসজেউসকি

2
ঠিক আছে .. আমি বাজি ধরব যে ওপি "নিরাপদে র্যান্ডম স্ট্রিং" সম্পর্কে কথা বলছে না। এই সমাধান সহজ এবং সুন্দর মনে রাখা, জন্য কম্প্যাক্ট হয় ডান ব্যবহারের ক্ষেত্রে। এবং, যদি আপনার সম্ভাব্য সংঘর্ষগুলির যত্ন নেওয়া প্রয়োজন, তবে কেন এলোমেলো স্ট্রিংয়ের জন্য টাইমস্ট্যাম্প সংযোজন / সংযোজন করবেন না? :)
এরেনর পাজ

46

আপনার প্রয়োগের উপর নির্ভর করে (আমি পাসওয়ার্ড তৈরি করতে চেয়েছিলাম), আপনি ব্যবহার করতে পারেন

$string = base64_encode(openssl_random_pseudo_bytes(30));

করুন Base64- হচ্ছে, তারা থাকতে পারে =বা -সেইসাথে অনুরোধ অক্ষর। আপনি একটি দীর্ঘতর স্ট্রিং তৈরি করতে পারেন, তারপরে ফিল্টার করুন এবং এগুলি সরাতে ট্রিম করুন।

openssl_random_pseudo_bytesপিএইচপিএলে একটি যথাযথ র্যান্ডম নম্বর উত্পন্ন করার প্রস্তাবিত উপায় বলে মনে হচ্ছে। কেন randব্যবহার করে না /dev/randomআমি জানি না।


2
র্যান্ড / ডিভ / ইউরেন্ডম ব্যবহার করে না কারণ এটি কেবল পরিবেশের মতো পিক্সিতে পাওয়া যায় এবং এটি পোর্টেবলও নয়।
ম্যাক্রোম্যান

3
@MacroMan কিন্তু openssl_random_pseudo_bytes() হয় পোর্টেবল।
জ্যাক

যদি আপনি অতিরিক্ত বেস 64 অক্ষরগুলি সরিয়ে ফেলতে চান তবে এটি ব্যবহার করে দেখুন: gist.github.com/zyphlar/7217f566fc83a9633959
উইলব্রেডলি

3
এটি ভুল নয়, তবে আপনি কীভাবে অযাচিত চরিত্রগুলি বাতিল করবেন সে বিষয়ে আমি সাবধানতার পরামর্শ দেব। উদাহরণস্বরূপ, পিএইচপি লিগের OAuth2 সার্ভারে এই টানুন অনুরোধটি দেখুন ।
স্কট আর্কিসজেউসকি

এটি সেরা উত্তরগুলির মধ্যে একটি। আফসোস এটির আরও সমর্থন নেই। অযাচিত চরিত্রগুলি আরও ভাল পরিচালনা করার জন্য আমি আপনার উত্তরটি সম্পাদনা করার পরামর্শ দিচ্ছি।
jcuenod

28

এখানে একটি সহজ ওয়ান-লাইনার যা কোনও স্ক্রিপ্ট স্তরের লুপিং বা ওপেনএসএসএল লাইব্রেরির ব্যবহার ছাড়াই সত্যিকারের এলোমেলো স্ট্রিং উত্পন্ন করে।

echo substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_rand(1,10))), 1, 10);

এটিকে ভেঙে ফেলার জন্য পরামিতিগুলি পরিষ্কার

// Character List to Pick from
$chrList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

// Minimum/Maximum times to repeat character List to seed from
$chrRepeatMin = 1; // Minimum times to repeat the seed string
$chrRepeatMax = 10; // Maximum times to repeat the seed string

// Length of Random String returned
$chrRandomLength = 10;

// The ONE LINE random command with the above variables.
echo substr(str_shuffle(str_repeat($chrList, mt_rand($chrRepeatMin,$chrRepeatMax))), 1, $chrRandomLength);

এই পদ্ধতিটি এলোমেলোভাবে চরিত্রের তালিকার পুনরাবৃত্তি করে কাজ করে, তারপরে সম্মিলিত স্ট্রিংটি shuffles করে এবং বর্ণিত অক্ষরের সংখ্যা প্রদান করে।

আপনি ফেরত স্ট্রিংয়ের দৈর্ঘ্যটি এলোমেলো করে, প্রতিস্থাপনের $chrRandomLengthমাধ্যমে mt_rand(8, 15)(8 থেকে 15 অক্ষরের মধ্যে একটি এলোমেলো স্ট্রিংয়ের জন্য) এটিকে আরও এলোমেলো করতে পারেন ।


দুঃখের সাথে বলতে চাই তবে যখন একটি চরিত্রটি তার পুনরায় সংঘটিত হওয়ার সম্ভাবনাটি বেছে নিয়েছে তখন পুলে থাকা অন্যান্য অক্ষরগুলির মতো উচ্চতা নেই। এখানে সত্যিকারের
এলোমেলোতা

@ দ্য সিসারিকান - আপনি এই বিবৃতিতে ভুল হবেন। এই অ্যালগরিদমটি ব্যবহার করে সমস্ত চরিত্রের সমান সম্ভাবনা থাকে এবং এটি সত্যই এলোমেলো। এটি chrList স্ট্রিং $ chrRepeatMax পুনরাবৃত্তি দ্বারা নিশ্চিত করা হয়, এবং যাদুটি সত্যই str_shuffle এ ঘটে যা এলোমেলোতা নির্ধারণ করে।
ক্র্যাং প্রাইম

সমস্ত অক্ষর কেবল একবার উপস্থিত হবে এবং এটি অনুমানের অনুমানের পক্ষে খুব প্রবণতা রয়েছে
ভিনিমাস

পছন্দ করেছেন চর স্ট্রিংটি আপনি যতগুলি অক্ষর চান তার জন্য নকল (দেখুন $chrRepeatMaxএবং $chrRepeatMin) - সুতরাং একটি 10 ​​চর স্ট্রিং, (সম্ভাব্য, তবে সম্ভব) হতে পারে, "আআআআআআআআআআ" হতে পারে।
ক্র্যাং প্রাইম

@ সানুয়েলজ্যাকসন দুঃখিত, আমি মিস-মন্তব্য করেছি। আমি মন্তব্য ভুল উত্তর দিয়েছি। তুমি ঠিক! আমি আসলে আপনার "কৌশল" ব্যবহার করেছি, তবে mt_rand ব্যবহার করি নি, কারণ এটি অকেজো আইএমএইচও। এটি এন্ট্রপিতে যোগ করে না। সর্বাধিক দৈর্ঘ্যের সাথে ব্যবহৃত কনস্ট const
ভিনিমাস

25
function generateRandomString($length = 15)
{
    return substr(sha1(rand()), 0, $length);
}

Tada!


মনে রাখবেন sha140 টি চরিত্রের সীমা এবং সর্বদা ছোট অক্ষরের ফলাফল হবে।
fyrye

3
sha1 স্ট্রিং এলোমেলো নয়, কিছু নির্দিষ্ট অক্ষর অন্যদের চেয়ে ঘন ঘন ঘটে থাকে। আপনি সত্যিকারের পাসওয়ার্ডের মতো এলোমেলোভাবে চান এমন ক্ষেত্রে এটি ব্যবহার করা বুদ্ধিমানের কাজ নয়।
কিট সান্দে

1
@ কিটসুন্ডে - হ্যাঁ, শ এলোমেলো নয়, র্যান্ড () এলোমেলো। এবং Sha এখানে যা প্রয়োজন তা পুরোপুরি ঠিক আছে। ওপিকে এলোমেলোভাবে ক্রিপ্টো স্তরের প্রয়োজন হয় না।
Davor

@ পছন্দমতো rant()এলোমেলোভাবে হওয়া কোন বিষয় নয় যখন শ সমানভাবে বিতরণ করা হয় না। আপনি যদি এলোমেলোভাবে অসম বিতরণ থেকে নির্বাচন করেন তবে আপনি ঠিক একই অসম বন্টন পাবেন। এটি হ'ল "ক্রিপ্টো স্তর" র্যান্ডমনেসটি আমি হাইলাইট করছি না, যদি এমনটি হয় তবে আপনারও ব্যবহার করা উচিত নয় rand()। এটি গ্রহণযোগ্য উত্তরের মতো একটি এমনকি ডিস্ট্রিবিউশন থেকে ছোঁড়াতে সর্বনিম্ন প্রচেষ্টা লাগে এবং এটি র্যান্ডের মতো এলোমেলো () যা যুক্তিসঙ্গত তাই।
কিট সান্দে

@ কিটসুন্ডে - এটি শেষ পর্যন্ত আক্ষরিকভাবে কোনও পার্থক্য তৈরি করে না। ওভাররিঞ্জাইনারিং এবং সোনার ধাতুপট্টাবৃতের সংজ্ঞা ঠিক এটি।
Davor

24

এই ফাংশনটি কার্যকর করার আরও ভাল উপায় হ'ল:

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

    $key = "";
    for($i=0; $i < $length; $i++) {
        $key .= $keys[mt_rand(0, count($keys) - 1)];
    }
    return $key;
}

echo RandomString(20);

mt_randঅনুযায়ী আরো এলোমেলো হয়ে যায় এই এবং এই পিএইচপি 7. মধ্যে randফাংশনের উপনাম হল mt_rand


1
সতর্কতা: mt_randক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত মান উত্পন্ন করে না। তার জন্য আপনার পিএইচপি 7 random_intবা ব্যবহার করা উচিত random_bytes
13'12

18

$randstringফাংশন স্কোপটি যেখানে আপনি এটিকে বলছেন সেই সুযোগের মতো নয়। আপনাকে একটি ভেরিয়েবলের জন্য ফেরতের মান নির্ধারণ করতে হবে।

$randstring = RandomString();
echo $randstring;

অথবা কেবল প্রত্যক্ষ ফেরতের মূল প্রতিধ্বনি:

echo RandomString();

এছাড়াও, আপনার ফাংশনে আপনার কিছুটা ভুল হয়েছে। লুপের মধ্যে, আপনাকে ব্যবহার করতে হবে .=যাতে প্রতিটি অক্ষর স্ট্রিংয়ের সাথে যুক্ত হয়। =আপনি ব্যবহার করে এটি সংযোজন পরিবর্তে প্রতিটি নতুন চরিত্রের সাথে এটি ওভাররাইট করছেন ।

$randstring .= $characters[rand(0, strlen($characters))];

14

প্রথমে আপনি যে বর্ণমালাটি ব্যবহার করতে চান তা সংজ্ঞায়িত করুন:

$alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$special  = '~!@#$%^&*(){}[],./?';
$alphabet = $alphanum . $special;

তারপরে, openssl_random_pseudo_bytes()যথাযথ এলোমেলো ডেটা তৈরি করতে ব্যবহার করুন:

$len = 12; // length of password
$random = openssl_random_pseudo_bytes($len);

অবশেষে, আপনি পাসওয়ার্ড তৈরি করতে এই এলোমেলো ডেটা ব্যবহার করেন। যেহেতু প্রতিটি অক্ষর অবধি $randomহতে পারে তাই কোডটি বর্ণমালার কেবলমাত্র অক্ষর বাছাই করা হয় তা নিশ্চিত করার জন্য কোডটি তার মূল মূল্য বিভাজনের পরে বাকী অংশটি ব্যবহার করে (নোট করুন যে এটি করার ফলে এলোমেলোভাবে পক্ষপাতিত্ব করা হয়েছে):chr(0)chr(255)$alphabet_length

$alphabet_length = strlen($alphabet);
$password = '';
for ($i = 0; $i < $len; ++$i) {
    $password .= $alphabet[ord($random[$i]) % $alphabet_length];
}

বিকল্পভাবে, এবং সাধারণত আরও ভাল, র্যান্ডমলিব এবং সিকিউরিটিলিব ব্যবহার করা হয় :

use SecurityLib\Strength;

$factory = new RandomLib\Factory;
$generator = $factory->getGenerator(new Strength(Strength::MEDIUM));

$password = $generator->generateString(12, $alphabet);

মডুলো অপারেটরের ব্যবহার %পক্ষপাতদুষ্ট আউটপুট উত্পাদন করবে। তবে র‌্যান্ডমলিবের জন্য শক্তিশালী +1। চাকা পুনরুদ্ধার করবেন না।
স্কট আর্কিসজেউসকি

1
হ্যাঁ, নতুন র্যান্ডম_িন্ট () ফাংশনটি দুর্দান্ত: ডি
জ্যাক

11

সংক্ষিপ্ত পদ্ধতি ..

এলোমেলো স্ট্রিং উত্পন্ন করার জন্য এখানে কয়েকটি সংক্ষিপ্ত পদ্ধতি রয়েছে

<?php
echo $my_rand_strng = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), -15); 

echo substr(md5(rand()), 0, 7);

echo str_shuffle(MD5(microtime()));
?>

10

আমি সেখানে সর্বাধিক জনপ্রিয় ফাংশনগুলির পারফরম্যান্স পরীক্ষা করেছি, আমার বাক্সে 32 টি চিহ্নের 1'000'000 স্ট্রিং তৈরি করার জন্য প্রয়োজনীয় সময়টি হ'ল:

2.5 $s = substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,32);
1.9 $s = base64_encode(openssl_random_pseudo_bytes(24));
1.68 $s = bin2hex(openssl_random_pseudo_bytes(16));
0.63 $s = base64_encode(random_bytes(24));
0.62 $s = bin2hex(random_bytes(16));
0.37 $s = substr(md5(rand()), 0, 32);
0.37 $s = substr(md5(mt_rand()), 0, 32);

দয়া করে মনে রাখবেন এটি আসলে কত দিন ছিল তা গুরুত্বপূর্ণ নয় তবে কোনটি ধীর এবং কোনটি দ্রুততর তাই আপনি ক্রিপ্টোগ্রাফি-প্রস্তুতি ইত্যাদি সহ আপনার প্রয়োজনীয়তা অনুযায়ী নির্বাচন করতে পারেন

আপনার যদি স্ট্রিং প্রয়োজন যা 32 টি চিহ্নের চেয়ে কম সংক্ষিপ্ত আকারের প্রয়োজন হলে MD5 এর আশেপাশে সাবস্ট্রাস্ট () যুক্ত করা হয়েছিল।

উত্তরের জন্য: স্ট্রিংটি সংক্ষিপ্ত নয় তবে ওভাররাইট করা এবং ফাংশনটির ফলাফল সংরক্ষণ করা হয়নি।


আমি মনে করি, এটি সেরা উত্তর। ধন্যবাদ!
এনসুকনি

10

পিএইচপি 7+ ব্যবহার ক্রিপ্টোগ্রাফি নিরাপদ র্যান্ডম বাইট জেনারেট করুন random_bytes ফাংশন।

$bytes = random_bytes(16);
echo bin2hex($bytes);

সম্ভাব্য আউটপুট

da821217e61e33ed4b2dd96f8439056c


পিএইচপি 5.3+ ওপেনএসএল_আরন্ডম_পসিউডো_বাইটস ফাংশন ব্যবহার করে সিউডো-এলোমেলো বাইট তৈরি করুন ।

$bytes = openssl_random_pseudo_bytes(16);
echo bin2hex($bytes);

সম্ভাব্য আউটপুট

e2d1254506fbb6cd842cd640333214ad


সেরা ব্যবহারের ক্ষেত্রে হতে পারে

function getRandomBytes($length = 16)
{
    if (function_exists('random_bytes')) {
        $bytes = random_bytes($length / 2);
    } else {
        $bytes = openssl_random_pseudo_bytes($length / 2);
    }
    return bin2hex($bytes);
}
echo getRandomBytes();

সম্ভাব্য আউটপুট

ba8cc342bdf91143


এটি প্রদত্ত দৈর্ঘ্যের সাথে একটি স্ট্রিং উত্পন্ন করবে না
টিম্বারম্যান

টিমবারম্যান এটি এখন সঠিক দৈর্ঘ্য উত্পন্ন করবে।
মদন সাপকোটা

9

একটি খুব দ্রুত উপায় হল এরকম কিছু করা:

substr(md5(rand()),0,10);

এটি 10 ​​টি অক্ষরের দৈর্ঘ্যের সাথে একটি এলোমেলো স্ট্রিং উত্পন্ন করবে। অবশ্যই, কেউ কেউ বলতে পারে এটি গণনার পক্ষে কিছুটা বেশি ভারী, তবে আজকাল প্রসেসরগুলি খুব দ্রুত এমডি 5 বা sha256 অ্যালগরিদম চালানোর জন্য অনুকূলিত হয়েছে। এবং অবশ্যই, যদিrand() ফাংশনটি একই মানটি দেয়, ফলাফল একই হবে, 1/32767 একই হওয়ার সম্ভাবনা রয়েছে। সুরক্ষা যদি সমস্যা হয় তবে কেবল এতে পরিবর্তন rand()করুনmt_rand()


7
function rndStr($len = 64) {
     $randomData = file_get_contents('/dev/urandom', false, null, 0, $len) . uniqid(mt_rand(), true);
     $str = substr(str_replace(array('/','=','+'),'', base64_encode($randomData)),0,$len);
    return $str;
}

4
এটি বহনযোগ্য নয়; যদি আপনি এটি কোনও পোস্ট-অ-পরিবেশে চালানোর চেষ্টা করেন তবে এটি মারাত্মক ত্রুটির কারণ হবে।
ব্রায়ান এজি

7

এটিকে প্রশাসক সূত্র থেকে নেওয়া হয়েছিল :

/** Get a random string
* @return string 32 hexadecimal characters
*/
function rand_string() {
    return md5(uniqid(mt_rand(), true));
}

প্রশাসক , পিএইচপি-র মধ্যে ডেটাবেস পরিচালনার সরঞ্জাম।


6

লারাভেল 5 ফ্রেমওয়ার্ক থেকে সহায়ক ফাংশন

/**
 * Generate a "random" alpha-numeric string.
 *
 * Should not be considered sufficient for cryptography, etc.
 *
 * @param  int  $length
 * @return string
 */
function str_random($length = 16)
{
    $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    return substr(str_shuffle(str_repeat($pool, $length)), 0, $length);
}

4
"ক্রিপ্টোগ্রাফি ইত্যাদির জন্য যথেষ্ট বিবেচনা করা উচিত নয়।" এটি দৃ strongly়ভাবে জোর দেওয়া উচিত।
স্কট আর্কিসজেউস্কি


4

ফাংশনটির সম্পাদিত সংস্করণটি ঠিকঠাক কাজ করে, তবে আমি খুঁজে পেলাম কেবল একটি সমস্যা: আপনি $ অক্ষরগুলি বদ্ধ করতে ভুল চরিত্রটি ব্যবহার করেছেন, তাই 'অক্ষরটি কখনও কখনও উত্পন্ন এলোমেলো স্ট্রিংয়ের অংশ হয়।

এটি ঠিক করতে, পরিবর্তন করুন:

$characters = 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;

প্রতি:

$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

এইভাবে কেবল সংযুক্ত অক্ষরগুলি ব্যবহৃত হয় এবং 'অক্ষরটি কখনই উত্পন্ন র্যান্ডম স্ট্রিংয়ের অংশ হতে পারে না।


4

অন্য একটি লাইনার, যা অক্ষর এবং সংখ্যা সহ 10 টি অক্ষরের এলোমেলো স্ট্রিং উত্পন্ন করে। এটি range(আকার নির্ধারণের জন্য দ্বিতীয় প্যারামিটারটি সামঞ্জস্য করে) দিয়ে একটি অ্যারে তৈরি করবে , এই অ্যারের উপরে লুপ করবে এবং এলোমেলো ASCII অক্ষর (পরিসর 0-9 বা অ্যাজ) নির্ধারণ করবে, তারপরে একটি স্ট্রিং পেতে অ্যারেটিকে প্রেরণ করবে।

$str = implode('', array_map(function () { return chr(rand(0, 1) ? rand(48, 57) : rand(97, 122)); }, range(0, 9)));

দ্রষ্টব্য: এটি কেবল পিএইচপি 5.3 এবং এর পরে কাজ করে


অবশেষে একটি সত্যই এলোমেলো সমাধান 32 বিট র্যান্ডম পূর্ণসংখ্যার কিছু বা
ফোলা

কেবলমাত্র একটি ইস্যু রয়েছে: সংখ্যাগুলি চরিত্রের মতো হওয়ার সম্ভাবনা থাকে যা আমি এটিকে পছন্দ করতে যতটা এলোমেলো নয়। যাইহোক এই পৃষ্ঠার সেরা সমাধানের জন্য +1। যে এবং এটি নিখুঁত tweak।
সুরিকান

টুইঙ্ক ... এই মত? rand(0, 57-48+122-97)<57-48?...:...? :)
vp_arth

4

এক রৈখিক.

এটি কিছু স্বতন্ত্রতার সাথে বিশাল স্ট্রিংগুলির পক্ষে দ্রুত।

function random_string($length){
    return substr(str_repeat(md5(rand()), ceil($length/32)), 0, $length);
}

md5(rand())একটি এলোমেলো সংখ্যা উত্পন্ন করার জন্য হ'ল ভয়ঙ্করভাবে সুরক্ষিত way
স্কট আর্কিসজেউসকি

1
এক্স দৈর্ঘ্য এবং কিছু স্বতন্ত্রতার সাথে একটি স্ট্রিং হ'ল উদ্দেশ্য। সত্য এলোমেলো উদ্দেশ্য নয়।
জ্যাকব স্মিথ


3

আমি সর্বশেষ মন্তব্যটি পছন্দ করেছিলাম যা ওপেনএসএল_আরন্ডম_সপোডো_বাইটস ব্যবহার করেছিল, তবে এটি আমার পক্ষে কোনও সমাধান নয় কারণ এখনও আমার যে চরিত্রগুলি চান না তা সরিয়ে ফেলতে হয়েছিল এবং আমি একটি নির্দিষ্ট দৈর্ঘ্যের স্ট্রিং পেতে সক্ষম হইনি। এখানে আমার সমাধান ...

function rndStr($len = 20) {
    $rnd='';
    for($i=0;$i<$len;$i++) {
        do {
            $byte = openssl_random_pseudo_bytes(1);
            $asc = chr(base_convert(substr(bin2hex($byte),0,2),16,10));
        } while(!ctype_alnum($asc));
        $rnd .= $asc;
    }
    return $rnd;
}


3

"1" এবং "l", "ও" এবং "0", ইত্যাদির মতো বর্ণচিহ্নগুলি বাদ দিয়ে, ব্যবহার বান্ধব এলোমেলো পাসওয়ার্ড তৈরি করার জন্য আমার সহজ একটি লাইন সমাধান এখানে ... এটি 5 টি অক্ষর তবে আপনি সহজেই করতে পারেন অবশ্যই এটি পরিবর্তন করুন:

$user_password = substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789'),0,5);

পরে jquery এ কল করতে এলোমেলো আইডি স্ট্রিং তৈরি করতে এটি উপযুক্ত। আইডি কে যদি এটির ভাল অনুশীলন হয় তবে এটি আমাকে গ্রহণযোগ্য উত্তরের মতো ব্যবহার না করে
অনেকটা সহায়তা করে

3

এখানে আরও একটি সমাধান দেওয়া হল।

function genRandomString($length = 10)
{
    if($length < 1)
        $length = 1;
    return substr(preg_replace("/[^A-Za-z0-9]/", '', base64_encode(openssl_random_pseudo_bytes($length * 2))), 0, $length);
}

পুনশ্চ. আমি উবুন্টুতে পিএইচপি 7.2 ব্যবহার করছি।


2

পিএইচপিতে একটি এলোমেলো স্ট্রিং উত্পন্ন করার আরেকটি উপায় হ'ল:

function RandomString($length) {
    $original_string = array_merge(range(0,9), range('a','z'), range('A', 'Z'));
    $original_string = implode("", $original_string);
    return substr(str_shuffle($original_string), 0, $length);
}
echo RandomString(6);

2

সত্যিকারের অনন্য এলোমেলো কী পেতে আমি এটি এখানে কীভাবে করছি:

$Length = 10;
$RandomString = substr(str_shuffle(md5(time())), 0, $Length);
echo $RandomString;

আপনি সময় () ব্যবহার করতে পারেন যেহেতু এটি ইউনিক্স টাইমস্ট্যাম্প এবং উপরে বর্ণিত অন্যান্য এলোমেলো তুলনায় সর্বদা অনন্য। তারপরে আপনি এর এমডি 5 সাম উত্পন্ন করতে পারেন এবং উত্পন্ন MD5 থেকে আপনার প্রয়োজনীয় কাঙ্ক্ষিত দৈর্ঘ্য নিতে পারেন স্ট্রিং । এই ক্ষেত্রে আমি 10 টি অক্ষর ব্যবহার করছি, এবং আমি যদি আরও অনন্য করতে চাই তবে আমি আরও দীর্ঘ স্ট্রিং ব্যবহার করতে পারি।

আশা করি এটা কাজে লাগবে.


2
অবশ্যই, time()অনন্য থেকে দূরে: এটি বর্তমান দ্বিতীয় শেষ হওয়া অবধি বার বার একই মানটি ফিরিয়ে দেবে। এখানে যা সত্যই কিছু এলোমেলোতা সরবরাহ করে str_shuffle()- তা হল কোডের বাকী অংশটি কেবলমাত্র চরিত্রগুলি বেছে নেওয়ার জন্য নমুনাকে হ্রাস করে।
vlvaro González

1
সুতরাং আপনি মূলত যা করছেন তা 32 বিট পূর্ণসংখ্যার কাছাকাছি পরিবর্তন করা। এখানে খুব বেশি এনট্রপি নেই ...
সুরিকান

2
একজন আক্রমণকারী তার দ্বারা প্রত্যাবর্তিত মানটি অনুমান করতে পারে time()(এটি কেবলমাত্র একটি টাইমস্ট্যাম্প), এটি এলোমেলোতার একটি দুর্বল উত্স।
এএল

2

পিএইচপি 5.1.0 থেকে কাজ করে শুধুমাত্র পিএইচপি নেটিভ ফাংশনগুলি ব্যবহার করে প্যারাম্যাট্রিসড ওয়ান-লাইনার

str_shuffle(implode('', (array_intersect_key(($map =  array_map('chr', array_merge(array_map('mt_rand', array_fill(0, $length = 25, 48), array_fill(0,$length,57)),array_map('mt_rand', array_fill(0, $length, 65), array_fill(0,$length,90)),array_map('mt_rand', array_fill(0, $length, 97), array_fill(0,$length,122))))), array_flip($keys = array_rand($map, $length))))))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.