এলোমেলোভাবে 5 টি অক্ষরের স্ট্রিং উত্পন্ন করুন


102

আমি নকল হওয়ার কমপক্ষে সম্ভাবনার সাথে সঠিক 5 টি এলোমেলো অক্ষরের স্ট্রিং তৈরি করতে চাই। এটি করার সর্বোত্তম উপায় কী হবে? ধন্যবাদ


4
আপনার কি একটি নির্দিষ্ট অক্ষর আছে বা কেবল 0-9a-zA-Z?
ইয়ানিক রচন

এই কোড গল্ফ চ্যালেঞ্জটি একটি সন্ধান হতে পারে: কোডগলফ.স্ট্যাকেক্সচেঞ্জ
টাইটাস

ব্যবহার করে Random::alphanumericString($length)আপনি 0-9a-zA-Z দিয়ে স্ট্রিংগুলি পেতে পারেন যা ক্রিপ্টোগ্রাফিকভাবে নিরাপদ এলোমেলো ডেটা থেকে উত্সাহিত হয়।
কাও

উত্তর:


164
$rand = substr(md5(microtime()),rand(0,26),5);

আমার সেরা অনুমান হবে - আপনি যদি বিশেষ চরিত্রগুলি নাও সন্ধান করেন তবে:

$seed = str_split('abcdefghijklmnopqrstuvwxyz'
                 .'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                 .'0123456789!@#$%^&*()'); // and any other characters
shuffle($seed); // probably optional since array_is randomized; this may be redundant
$rand = '';
foreach (array_rand($seed, 5) as $k) $rand .= $seed[$k];

উদাহরণ

এবং, ঘড়ির উপর ভিত্তি করে কারও জন্য (যেহেতু এটি ক্রমবর্ধমান হয় কম সংঘর্ষ):

function incrementalHash($len = 5){
  $charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  $base = strlen($charset);
  $result = '';

  $now = explode(' ', microtime())[1];
  while ($now >= $base){
    $i = $now % $base;
    $result = $charset[$i] . $result;
    $now /= $base;
  }
  return substr($result, -5);
}

দ্রষ্টব্য: বর্ধমান অর্থ অনুমান করা সহজ; আপনি যদি এটি লবণ বা যাচাইয়ের টোকেন হিসাবে ব্যবহার করেন তবে করবেন না। "WCWyb" এর একটি লবণের অর্থ এখন থেকে 5 সেকেন্ডের মধ্যে এটি "WCWyg")


6
ব্যবহার করে সমস্যা md5()তবে যে আপনি একটি স্ট্রিং একটি 16 অক্ষরের সেট দিয়ে তৈরি (10 সংখ্যার এবং পেতে হয় aথেকে f, অর্থাত্ স্ট্রিং অক্ষর প্রতি 4 টি বিট)। এটি কিছু উদ্দেশ্যে যথেষ্ট হতে পারে তবে ক্রিপ্টোগ্রাফিক উদ্দেশ্যে খুব কম হতে পারে (16 টি চিহ্নের মধ্যে পাঁচটি অক্ষর = 16 ^ 5 = 20 বিট = 1048576 সম্ভাবনা)।
আর্ক

4
array_rand($seed, 5)অ্যারে কীটি ফিরে আসবে, মান হিসাবে নয়, তাই আপনার কোডটি কাজ করবে না
alumi

4
আমি মনে করি যে এলোমেলো অক্ষর তৈরি করতে কোনও ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন ব্যবহার করা কমপক্ষে অনুপযুক্ত।
gronostaj

এটা সম্ভব এছাড়াও অন্তর্ভুক্ত করা হয় ", 'এবং ব্যাকস্ল্যাশ $charset? এই চরিত্রগুলি অন্তর্ভুক্ত করার জন্য আমার কি পালানোর ক্রমগুলি ব্যবহার করা দরকার?
মাই

4
দ্বিতীয় স্নিপেট এমনকি $lenইনপুট প্যারাম ব্যবহার করে না ... আপনি কি তা ভুলে গেছেন?
টেকনিকুইস্ট

79

যদি forলুপগুলি স্বল্প সরবরাহে থাকে তবে আমি যা ব্যবহার করতে চাই তা এখানে:

$s = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 5)), 0, 5);

আকর্ষণীয় সমাধান ... খুব সংক্ষিপ্ত, যদিও আমি এটির জন্য ব্যবহারের চেয়ে দ্রুত বা ধীর কিনা তা নিয়ে অবাক হয়েছি। যদিও :-)
আর্চ

@ মাতৃআরআর_শ্যাফেল ক্রমাগত সদৃশগুলি তৈরি করবে
এসসিসি

@ ব্যবহারকারী ২২২2০৫7: str_shuffle('ab')দিবে abবা দিবে baকিন্তু কখনও দেবে না aa। যোগ করার str_repeatঅনুমতি দেয় এটির জন্য। তবে এটি বলেছিল যে আমি যে সমাধান দিয়েছি তা আসলেই মারাত্মক নয় ... যদিও এটি কার্যকরভাবে কাজ করে।
ম্যাথু

4
আরএনজি অভিন্নভাবে বিতরণ করা হয়েছে বলে ধরে নিয়েই ঘটনার একটি 1/60466176 সম্ভাবনা রয়েছে।
ম্যাথু

4
এটি ভাউচার কোড উত্পন্ন করার ক্ষেত্রে আমাদের ব্যবহারের ক্ষেত্রে উপযুক্ত। আমাদের অক্ষর, মত বিভ্রান্তিকর সরানো l, i, 1, 0, O, ইত্যাদি এবং আউট 500 ভাউচার কোন সদৃশ পেয়েছিলাম।
লুক কাজিন্স

25

একটি দ্রুত উপায় হল ইউনিকিড ফাংশনের সর্বাধিক উদ্বায়ী অক্ষরগুলি ব্যবহার করা ।

উদাহরণ স্বরূপ:

$rand = substr(uniqid('', true), -5);


15

নিম্নলিখিতটিতে নকলকরণের সর্বনিম্ন সুযোগ সরবরাহ করা উচিত (আপনি mt_rand()আরও ভাল এলোমেলো সংখ্যার উত্সের সাথে প্রতিস্থাপন করতে চাইতে পারেন যেমন /dev/*randomজিইউডিগুলি থেকে বা থেকে):

<?php
    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    $result = '';
    for ($i = 0; $i < 5; $i++)
        $result .= $characters[mt_rand(0, 61)];
?>

সম্পাদনা করুন:
আপনি নিরাপত্তা নিয়ে উদ্বিগ্ন হয়, সত্যিই, না না ব্যবহার rand()বা mt_rand(), এবং যাচাই করুন যে আপনার র্যান্ডম ডেটা ডিভাইস আসলে একটি ডিভাইস উৎপাদিত হয় র্যান্ডম ডেটা, না নিয়মিত ফাইল অথবা কিছু আন্দাজের /dev/zeromt_rand()ক্ষতিকারক হিসাবে বিবেচিত:
https://spideroak.com/blog/20121205114003-exploit-information-leaks-in-random-numbers-from-python-ruby-and-php

সম্পাদনা: আপনার যদি পিএইচপিতে ওপেনএসএসএল সমর্থন থাকে তবে আপনি ব্যবহার করতে পারেন openssl_random_pseudo_bytes():

<?php
    $length = 5;
    $randomBytes = openssl_random_pseudo_bytes($length);
    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    $charactersLength = strlen($characters);
    $result = '';
    for ($i = 0; $i < $length; $i++)
        $result .= $characters[ord($randomBytes[$i]) % $charactersLength];
?>

প্রথম উদাহরণ $ ফলাফল নিয়ে আরো চালাক = $ অক্ষর [mt_rand (0, strlen ($ অক্ষর) -1)]।
hamboy75

সেক্ষেত্রে আপনার দৈর্ঘ্য আগেই নির্ধারণ করা উচিত এবং এটিকে কমপক্ষে একটি ভেরিয়েবলে সঞ্চয় করা উচিত। strlen()একটি লুপে ব্যবহার করা অপ্রয়োজনীয় ওভারহেড, বিশেষত আপনি যদি ইতিমধ্যে জানেন যে ইতিমধ্যে চরিত্র সেটটি পরিবর্তন হচ্ছে না।
আর্ক

আমি সন্দেহ করি, পিএইচপি অপ্টিমাইজড, যাইহোক এটি একটি বিকল্প :)
hamboy75

7

আমি সর্বদা এটির জন্য একই ফাংশনটি ব্যবহার করি, সাধারণত পাসওয়ার্ড তৈরি করতে। এটি ব্যবহার করা সহজ এবং দরকারী।

function randPass($length, $strength=8) {
    $vowels = 'aeuy';
    $consonants = 'bdghjmnpqrstvz';
    if ($strength >= 1) {
        $consonants .= 'BDGHJLMNPQRSTVWXZ';
    }
    if ($strength >= 2) {
        $vowels .= "AEUY";
    }
    if ($strength >= 4) {
        $consonants .= '23456789';
    }
    if ($strength >= 8) {
        $consonants .= '@#$%';
    }

    $password = '';
    $alt = time() % 2;
    for ($i = 0; $i < $length; $i++) {
        if ($alt == 1) {
            $password .= $consonants[(rand() % strlen($consonants))];
            $alt = 0;
        } else {
            $password .= $vowels[(rand() % strlen($vowels))];
            $alt = 1;
        }
    }
    return $password;
}

চমৎকার কোড। তবে $এইচটি সর্বদা এক থেকে ২ এ ফ্লিপ হয় instead পরিবর্তে $এইচটি এলোমেলো করে দেওয়া কি ভাল হবে না?
নিকো আন্দ্রেড

6

মনে হচ্ছে এটির জন্য str_shuffle একটি ভাল ব্যবহার হবে। আপনি যে কোনও চরিত্রের সাথে এলোমেলো করে দিন।

$my_rand_strng = substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), -5);

পিএইচপি টি উভয় ভাল আপ: php.net/manual/en/function.substr.php php.net/manual/en/function.str-shuffle.php
Creeperstanson


2

যদি এটি ঠিক থাকে যে আপনি কেবলমাত্র এএফ পাবেন, তবে আমার সমাধানটি এখানে দেওয়া হয়েছে:

str_pad(dechex(mt_rand(0, 0xFFFFF)), 5, '0', STR_PAD_LEFT);

আমি বিশ্বাস করি যে হ্যাশ ফাংশন ব্যবহার করা এলোমেলোভাবে হেক্সাডেসিমাল অঙ্কের ক্রম তৈরির মতো একটি সাধারণ কাজের জন্য একটি ওভারকিল। dechex+ mt_randএকই কাজটি করবে তবে অযৌক্তিক ক্রিপ্টোগ্রাফিক কাজ ছাড়াই। str_padআউটপুট স্ট্রিংয়ের 5-অক্ষরের দৈর্ঘ্যের গ্যারান্টি দেয় (যদি এলোমেলো সংখ্যা 0x10000 এর চেয়ে কম হয়)।

সদৃশ সম্ভাবনা mt_randনির্ভরযোগ্যতার নির্ভরযোগ্যতার উপর নির্ভর করে । মার্সেন টুইস্টার উচ্চ মানের র্যান্ডমনেস জন্য পরিচিত, তাই এটি কাজটি ভালভাবে ফিট করা উচিত।


2

আমি পিএইচপি'র ব্যবহার করার চিন্তা না করা পর্যন্ত আমি কীভাবে এটি করব তা জানতাম না array। এবং আমি যথেষ্ট নিশ্চিত যে এটি হ'ল অ্যারে সহ একটি এলোমেলো স্ট্রিং বা সংখ্যা উত্পন্ন করার সহজতম উপায় way কোড:

function randstr ($len=10, $abc="aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789") {
    $letters = str_split($abc);
    $str = "";
    for ($i=0; $i<=$len; $i++) {
        $str .= $letters[rand(0, count($letters)-1)];
    };
    return $str;
};

আপনি এই ফাংশনটি এভাবে ব্যবহার করতে পারেন

randstr(20)     // returns a random 20 letter string
                // Or like this
randstr(5, abc) // returns a random 5 letter string using the letters "abc"

1

অনুরূপ ব্র্যাড ক্রিস্টির এর উত্তর কিন্তু ব্যবহার sha1অক্ষরের জন্য alrorithm 0-9a-zA-Zএবং একটি র্যান্ডম মান পূর্বে সমাধান:

$str = substr(sha1(mt_rand() . microtime()), mt_rand(0,35), 5);

তবে যদি আপনি একটি সংজ্ঞায়িত (অনুমোদিত) অক্ষর সেট করে থাকেন:

$validChars = array('0','1','2' /*...*/,'?','-','_','a','b','c' /*...*/);
$validCharsCount = count($validChars);

$str = '';
for ($i=0; $i<5; $i++) {
    $str .= $validChars[rand(0,$validCharsCount - 1)];
}

** আপডেট **

আর্কিমিডিকস যেমন উল্লেখ করেছেন, প্রদত্ত চরিত্রের সীমাটির জন্য সংমিশ্রণের সংখ্যা কম হওয়ায় এটি "নকল হওয়ার নূন্যতম সম্ভাবনা" ফেরত দেওয়ার গ্যারান্টি দেয় না। হয় আপনার অক্ষরের সংখ্যা বাড়াতে হবে, বা স্ট্রিংয়ে অতিরিক্ত (বিশেষ) অক্ষরের অনুমতি দেওয়া দরকার। আমি মনে করি, প্রথম সমাধানটি পছন্দনীয় হবে।


ব্যবহার করা time()তার চেয়ে 1 মিলিয়ন গুণ বেশি অনুমানযোগ্য microtime()
আর্ক

এছাড়াও ব্র্যাড এর উত্তর আমার মন্তব্য করে মনে রাখবেন, বড় সমস্যাটি হল এই যে উত্পন্ন হ্যাশ একটি হেক্সাডেসিমেল 16 বৈধ অক্ষর নিয়ে গঠিত উপস্থাপনা, তাই শুধু 1024 বৈচিত্র ছাড়ার হয় $str
আর্ক

@ আর্কিমিডিক্স, সম্ভবত, তবে ওপি সুরক্ষা চেয়েছিল না, প্রশ্নটি সংজ্ঞায়িত করা হয়েছিল যে স্ট্রিং উত্পন্ন অ্যালগরিদম 5x26 বিভিন্ন অক্ষরের সংমিশ্রণ এবং নকলগুলি এড়ানো হবে। এটি সম্ভবত কোনও রেজিস্ট্রেশন প্রক্রিয়ায় (বা বিলিং প্রক্রিয়া) কোনও নিশ্চয়তার রেফারেন্স নম্বর বা কোনও
কিছুর জন্য

এটা আমার বোঝার ছিল যে, তিনি করেনি জন্য অনুরোধ সদৃশ পেয়ে অন্তত সম্ভাবনা , এবং এই 0.1% সম্ভাবনা (1024 সালে 1) 1 বিলিয়ন প্রায় 1 হতে পারত যা হয়েছে।
আর্ক

তবে, যদি আপনার 5 টি অক্ষরের একটি রেফারেন্স কী উত্পন্ন করার প্রয়োজন হয় এবং আপনাকে একটি ক্লায়েন্ট / গ্রাহক দেওয়া হয় তবে আপনি " ˫§»⁋⅓" এটিকে কেবল সুরক্ষিত করার কারণে তাদের দিতে চান না ... আপনি আপনার রেফারেন্স কীটি 7 বা ততোধিক অক্ষরগুলিতে বাড়িয়েছেন । : (BTW আমার আগের মন্তব্যে সংশোধন, এটা 5x36 অক্ষর)
Yanick Rochon


1

উত্স: পিএইচপি ফাংশন যা এলোমেলো অক্ষর উত্পন্ন করে

এই সহজ পিএইচপি ফাংশনটি আমার জন্য কাজ করেছিল:

function cvf_ps_generate_random_code($length=10) {

   $string = '';
   // You can define your own characters here.
   $characters = "23456789ABCDEFHJKLMNPRTVWXYZabcdefghijklmnopqrstuvwxyz";

   for ($p = 0; $p < $length; $p++) {
       $string .= $characters[mt_rand(0, strlen($characters)-1)];
   }

   return $string;

}

ব্যবহার:

echo cvf_ps_generate_random_code(5);

1

এখানে আমার random 5 cents...

$random=function($a, $b) {
    return(
        substr(str_shuffle(('\\`)/|@'.
        password_hash(mt_rand(0,999999),
        PASSWORD_DEFAULT).'!*^&~(')),
        $a, $b)
    );
};

echo($random(0,5));

পিএইচপি-র নতুন password_hash()(*> = পিএইচপি 5.5) ফাংশন বড় হাতের অক্ষর এবং ছোট হাতের অক্ষর এবং সংখ্যার জন্য দীর্ঘ দীর্ঘ সেট তৈরি করার জন্য কাজ করছে।

দুটি কনক্যাট। password_hash$ র্যান্ডম ফাংশনটির আগে এবং পরে স্ট্রিংগুলি পরিবর্তনের জন্য উপযুক্ত।

জন্য Paramteres $random()* ($ একটি, $ খ) আসলে substr()প্যারামিটার। :)

দ্রষ্টব্য: এটি কোনও ফাংশন হওয়ার দরকার নেই, এটি স্বাভাবিক পরিবর্তনশীলও হতে পারে .. একজন দুষ্টু সিঙ্গললাইনার হিসাবে, এর মতো:

$random=(substr(str_shuffle(('\\`)/|@'.password_hash(mt_rand(0,999999), PASSWORD_DEFAULT).'!*^&~(')), 0, 5));

echo($random);

1
function CaracteresAleatorios( $Tamanno, $Opciones) {
    $Opciones = empty($Opciones) ? array(0, 1, 2) : $Opciones;
    $Tamanno = empty($Tamanno) ? 16 : $Tamanno;
    $Caracteres=array("0123456789","abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    $Caracteres= implode("",array_intersect_key($Caracteres, array_flip($Opciones)));
    $CantidadCaracteres=strlen($Caracteres)-1;
    $CaracteresAleatorios='';
    for ($k = 0; $k < $Tamanno; $k++) {
        $CaracteresAleatorios.=$Caracteres[rand(0, $CantidadCaracteres)];
    }
    return $CaracteresAleatorios;
}

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

0

আইওয়েভ এভয়েস এটি ব্যবহার করে:

<?php function fRand($len) {
    $str = '';
    $a = "abcdefghijklmnopqrstuvwxyz0123456789";
    $b = str_split($a);
    for ($i=1; $i <= $len ; $i++) { 
        $str .= $b[rand(0,strlen($a)-1)];
    }
    return $str;
} ?>

আপনি যখন এটি কল করবেন তখন স্ট্রিংয়ের দৈর্ঘ্য সেট করে।

<?php echo fRand([LENGHT]); ?>

আপনি স্ট্রিংয়ের সম্ভাব্য অক্ষরও পরিবর্তন করতে পারেন $a


আমি হারিয়ে যাওয়া সময়টি অবিচ্ছিন্নভাবে এই ফাংশনটি বিকাশ করতে দেখছি। আমি একটু গুগল! @ অ্যান্ড্রু
লিপসপ্রাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.