আমি কীভাবে এলোমেলো অক্ষরগুলি তৈরি করতে পারি?


965

আমি কীভাবে সি # এ একটি এলোমেলো 8 অক্ষর বর্ণানুক্রমিক স্ট্রিং উত্পন্ন করতে পারি?


2
চরিত্রের সেটটিতে যদি আপনার কোনও বিধিনিষেধ থাকে? শুধু ইংরেজি ভাষার অক্ষর এবং 0-9? মিশ্র ঘটনা?
এরিক জে।


9
নোট করুন যে Randomপাসওয়ার্ড উত্পন্ন করতে আপনার ক্লাসের উপর ভিত্তি করে কোনও পদ্ধতি ব্যবহার করা উচিত নয় । এর বীজের Randomখুব কম এনট্রপি রয়েছে, সুতরাং এটি সত্যই নিরাপদ নয়। পাসওয়ার্ডগুলির জন্য একটি ক্রিপ্টোগ্রাফিক PRNG ব্যবহার করুন।
কোডসইনচওস

2
এই প্রশ্নে ভাষার স্থানীয়করণ অন্তর্ভুক্ত করে ভাল লাগবে। বিশেষত যদি আপনার গুইয়ের জন্য চাইনিজ বা বুলগেরিয়ান খাবার সরবরাহ করতে হয়!
পিটার জামসেমসন

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

উত্তর:


1683

আমি শুনেছি লিনকিউটি নতুন কালো, তাই এখানে লিনকিউ ব্যবহারের চেষ্টা করা হল:

private static Random random = new Random();
public static string RandomString(int length)
{
    const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    return new string(Enumerable.Repeat(chars, length)
      .Select(s => s[random.Next(s.Length)]).ToArray());
}

(দ্রষ্টব্য: Randomক্লাসের ব্যবহার সুরক্ষা সম্পর্কিত যে কোনও পাসওয়ার্ড বা টোকেন তৈরির জন্য এটি অনুপযুক্ত করে তোলে you আপনার RNGCryptoServiceProviderযদি শক্তিশালী এলোমেলো নম্বর জেনারেটরের প্রয়োজন হয় তবে শ্রেণিটি ব্যবহার করুন ))


23
@ অ্যালেক্স: আমি কয়েকটি দ্রুত পরীক্ষা চালিয়েছি এবং লম্বা স্ট্রিং তৈরি করার সময় এটি বেশ লিনিয়ার স্কেল করে বলে মনে হচ্ছে (যতক্ষণ না যথেষ্ট পরিমাণে স্মৃতি উপলব্ধ রয়েছে)। এটি বলে, ড্যান রিগবির উত্তর প্রতিটি পরীক্ষায় এটির চেয়ে প্রায় দ্বিগুণ দ্রুত।
লুক

6
আমরা হব. যদি আপনার মানদণ্ডটি হয় যে এটি লিনাক ব্যবহার করে এবং এটিতে একটি লস কোডের বিবরণ রয়েছে তবে এটি অবশ্যই মৌমাছির হাঁটুর। কোড বর্ণনা এবং বাস্তবায়নের আসল পথ উভয়ই বরং অদক্ষ এবং অপ্রত্যক্ষ। আমাকে ভুল করবেন না, আমি একটি বিশাল কোড হিপস্টার (আমি পাইথনকে ভালবাসি), তবে এটি প্রায় একটি গোল্ডবার্গ মেশিন।

5
যদিও এটি প্রযুক্তিগতভাবে প্রশ্নের উত্তর দেয়, এটির আউটপুটটি খুব বিভ্রান্তিকর। জেনারেট 8 র্যান্ডম অক্ষর শব্দ শুনে মনে হচ্ছে থাকতে পারে খুব অনেক ফলাফল, যেহেতু এই শ্রেষ্ঠ সময়ে উৎপন্ন 2 বিলিয়ন বিভিন্ন ফলাফল নেই। এবং অনুশীলনে আরও কম। সুরক্ষা সম্পর্কিত কোনও জিনিসের জন্য এটি ব্যবহার না করার জন্য আপনার একটি বিগ ফ্যাট সতর্কতাও যুক্ত করা উচিত।
কোডসইনচাওস 17'12

41
@ এক্সাইসফট: ছোট হাতের অক্ষরগুলি পাঠকের অনুশীলন হিসাবে ছেড়ে দেওয়া হয়েছে।
ডিটিবি

15
নিম্নলিখিত লাইনটি প্রদত্ত একের চেয়ে বেশি স্মৃতি (এবং এইভাবে সময়) দক্ষreturn new string(Enumerable.Range(1, length).Select(_ => chars[random.Next(chars.Length)]).ToArray());
টাইসন উইলিয়ামস

374
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
var stringChars = new char[8];
var random = new Random();

for (int i = 0; i < stringChars.Length; i++)
{
    stringChars[i] = chars[random.Next(chars.Length)];
}

var finalString = new String(stringChars);

লিনক সমাধানের মতো মার্জিত নয়।

(দ্রষ্টব্য: Randomক্লাসের ব্যবহার সুরক্ষা সম্পর্কিত যে কোনও পাসওয়ার্ড বা টোকেন তৈরির জন্য এটি অনুপযুক্ত করে তোলে you আপনার RNGCryptoServiceProviderযদি শক্তিশালী এলোমেলো নম্বর জেনারেটরের প্রয়োজন হয় তবে শ্রেণিটি ব্যবহার করুন ))


4
@ অ্যালেক্স: এটি নিখুঁত দ্রুত উত্তর নয়, তবে এটি দ্রুততম "আসল" উত্তর (যেমন, ব্যবহৃত চরিত্রগুলির উপর নিয়ন্ত্রণের মঞ্জুরি দেয় এবং স্ট্রিংয়ের দৈর্ঘ্য) is
লুক এইচ

2
@ অ্যালেক্স: অ্যাডাম পোরাদের GetRandomFileNameসমাধান দ্রুততর তবে ব্যবহৃত অক্ষরগুলির কোনও নিয়ন্ত্রণের অনুমতি দেয় না এবং সর্বাধিক সম্ভাব্য দৈর্ঘ্য 11 টি হয়। ডগলাসের Guidসমাধানটি বিদ্যুত্-দ্রুত, তবে অক্ষরগুলি A-F0-9 এর মধ্যে সীমাবদ্ধ এবং সর্বোচ্চ সম্ভাব্য দৈর্ঘ্য 32 অক্ষর।
লুক 1

1
@ অ্যাডাম: হ্যাঁ, আপনি একাধিক কল করার ফলাফলকে একত্রে করতে পারেন GetRandomFileNameতবে তারপরে (ক) আপনি আপনার কার্যকারিতা সুবিধা হারাবেন এবং (খ) আপনার কোডটি আরও জটিল হয়ে উঠবে।
লুক

1
@xaSoft আপনার লুপের বাইরে এলোমেলো () অবজেক্টের উদাহরণ তৈরি করুন। যদি আপনি অল্প বিরতিতে র্যান্ডম () এর প্রচুর উদাহরণ তৈরি করেন তবে .Nxt () তে কলটি র্যান্ডম () একটি সময় ভিত্তিক বীজ ব্যবহার করার মতো একই মান প্রদান করবে।
ড্যান রিগবি

2
@xaisoft সুরক্ষা, পাসওয়ার্ডের মতো কোনও সুরক্ষার জন্য এই উত্তরটি ব্যবহার করবেন না। System.Randomসুরক্ষা জন্য উপযুক্ত নয়।
কোডসইনচাউস

333

মন্তব্য ভিত্তিক আপডেট করা। আসল বাস্তবায়ন সময়ের আহ ~ 1.95% এবং বাকী অক্ষরগুলি সময়ের ~ 1.56% উত্পন্ন করে। আপডেটটি সমস্ত অক্ষর ~ সময়ের 1.61% উত্পন্ন করে।

ফ্রেম ওয়ার্ক সাপোর্ট -। নেট কোর 3 (এবং ভবিষ্যতের প্ল্যাটফর্মগুলি। নেট স্ট্যান্ডার্ড 2.1 বা তত উপরে সমর্থন করে) একটি ক্রিপ্টোগ্রাফিক সাউন্ড মেথড র্যান্ডম NumberGenerator.GetInt32 () একটি পছন্দসই পরিসরের মধ্যে একটি এলোমেলো পূর্ণসংখ্যার উত্পাদন করতে সরবরাহ করে।

উপস্থাপিত কিছু বিকল্পের বিপরীতে, এটি হ'ল ক্রিপ্টোগ্রাফিকভাবে সাবলীল

using System;
using System.Security.Cryptography;
using System.Text;

namespace UniqueKey
{
    public class KeyGenerator
    {
        internal static readonly char[] chars =
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray(); 

        public static string GetUniqueKey(int size)
        {            
            byte[] data = new byte[4*size];
            using (RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider())
            {
                crypto.GetBytes(data);
            }
            StringBuilder result = new StringBuilder(size);
            for (int i = 0; i < size; i++)
            {
                var rnd = BitConverter.ToUInt32(data, i * 4);
                var idx = rnd % chars.Length;

                result.Append(chars[idx]);
            }

            return result.ToString();
        }

        public static string GetUniqueKeyOriginal_BIASED(int size)
        {
            char[] chars =
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
            byte[] data = new byte[size];
            using (RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider())
            {
                crypto.GetBytes(data);
            }
            StringBuilder result = new StringBuilder(size);
            foreach (byte b in data)
            {
                result.Append(chars[b % (chars.Length)]);
            }
            return result.ToString();
        }
    }
}

এখানে বিকল্প আলোচনার ভিত্তিতে এবং নীচের মন্তব্যের ভিত্তিতে আপডেট / সংশোধিত।

এখানে একটি ছোট পরীক্ষার জোতা যা পুরানো এবং আপডেট হওয়া আউটপুটে অক্ষরের বিতরণকে দেখায়। এলোমেলো বিশ্লেষণের গভীর আলোচনার জন্য , random.org দেখুন।

using System;
using System.Collections.Generic;
using System.Linq;
using UniqueKey;

namespace CryptoRNGDemo
{
    class Program
    {

        const int REPETITIONS = 1000000;
        const int KEY_SIZE = 32;

        static void Main(string[] args)
        {
            Console.WriteLine("Original BIASED implementation");
            PerformTest(REPETITIONS, KEY_SIZE, KeyGenerator.GetUniqueKeyOriginal_BIASED);

            Console.WriteLine("Updated implementation");
            PerformTest(REPETITIONS, KEY_SIZE, KeyGenerator.GetUniqueKey);
            Console.ReadKey();
        }

        static void PerformTest(int repetitions, int keySize, Func<int, string> generator)
        {
            Dictionary<char, int> counts = new Dictionary<char, int>();
            foreach (var ch in UniqueKey.KeyGenerator.chars) counts.Add(ch, 0);

            for (int i = 0; i < REPETITIONS; i++)
            {
                var key = generator(KEY_SIZE); 
                foreach (var ch in key) counts[ch]++;
            }

            int totalChars = counts.Values.Sum();
            foreach (var ch in UniqueKey.KeyGenerator.chars)
            {
                Console.WriteLine($"{ch}: {(100.0 * counts[ch] / totalChars).ToString("#.000")}%");
            }
        }
    }
}

11
এটি আমার কাছে সঠিক পদ্ধতির মতো দেখে মনে হচ্ছে - এলোমেলো পাসওয়ার্ড, সল্ট, এনট্রপি এবং আরও অনেক কিছু এলোমেলো () ব্যবহার করে উত্পন্ন করা উচিত নয় যা গতির জন্য অনুকূলিত এবং সংখ্যার পুনরুত্পাদনযোগ্য ক্রম তৈরি করে; অন্যদিকে আরএনজিক্রিপ্টো সার্ভিসপ্রোভাডার.গেটননজিরোবাইটস () এমন সংখ্যার বন্য সিকোয়েন্স তৈরি করে যা পুনরুত্পাদনযোগ্য নয়।
mindplay.dk

25
বর্ণগুলি সামান্য পক্ষপাতদুষ্ট (255% 62! = 0)। এই সামান্য ত্রুটি থাকা সত্ত্বেও, এটি এখানকার সেরা সমাধান।
কোডসইনচাওস

13
মনে রাখবেন যে আপনি ক্রিপ্টো শক্তি, পক্ষপাতহীন এলোমেলোতা চাইলে এটি শব্দ নয় । (এবং যদি আপনি এটি না চান তবে প্রথমে কেন ব্যবহার করবেন RNGCSP?) charsঅ্যারেতে সূচি মোড ব্যবহার করার অর্থ chars.Length256 এর বিভাজক না হওয়া পর্যন্ত আপনি পক্ষপাতদুষ্ট আউটপুট পাবেন
লূকএইচ

15
পক্ষপাত অনেকটা হ্রাস করার একটি সম্ভাবনা, 4*maxSizeর্যান্ডম বাইটগুলির জন্য অনুরোধ করা হচ্ছে , তারপরে ব্যবহার করুন (UInt32)(BitConverter.ToInt32(data,4*i)% chars.Length। আমি এর GetBytesপরিবর্তেও ব্যবহার করতাম GetNonZeroBytes। এবং অবশেষে আপনি প্রথম কলটি সরাতে পারেন GetNonZeroBytes। আপনি এর ফলাফল ব্যবহার করছেন না।
কোডসইনচাউস

14
মজাদার ঘটনা: এজেড এজে 0-9 62 টি অক্ষর। লোকেরা বর্ণের পক্ষপাতিত্ব দেখায় কারণ 256% 62! = 0. ইউটিউবের ভিডিও আইডিগুলি এজেড এজে 0-9, পাশাপাশি "-" এবং "_", যা 64 সম্ভাব্য অক্ষর তৈরি করে, যা সমানভাবে 256 এ বিভক্ত হয়। কাকতালীয়? আমি মনে করি না! :)
qJake

200

সলিউশন 1 - সবচেয়ে নমনীয় দৈর্ঘ্যের সাথে বৃহত্তম 'ব্যাপ্তি'

string get_unique_string(int string_length) {
    using(var rng = new RNGCryptoServiceProvider()) {
        var bit_count = (string_length * 6);
        var byte_count = ((bit_count + 7) / 8); // rounded up
        var bytes = new byte[byte_count];
        rng.GetBytes(bytes);
        return Convert.ToBase64String(bytes);
    }
}

এই সমাধানটি জিইউডি ব্যবহারের চেয়ে আরও পরিসরযুক্ত কারণ একটি জিইউডির কয়েকটি স্থির বিট থাকে যা সর্বদা একই এবং তাই এলোমেলো নয়, উদাহরণস্বরূপ হেক্সের 13 টি অক্ষর সর্বদা "4" থাকে - কমপক্ষে সংস্করণ 6 জিইউডিতে।

এই সমাধান আপনাকে যে কোনও দৈর্ঘ্যের একটি স্ট্রিং তৈরি করতে দেয়।

সমাধান 2 - কোডের এক লাইন - 22 টিরও বেশি অক্ষরের জন্য ভাল

Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 8);

স্লিউশন 1 না হওয়া পর্যন্ত আপনি স্ট্রিং তৈরি করতে পারবেন না এবং জিইউইডিতে স্থির বিটের কারণে স্ট্রিংয়ের একই পরিসীমা নেই তবে অনেক ক্ষেত্রে এটি কাজ করবে।

সমাধান 3 - কিছুটা কম কোড

Guid.NewGuid().ToString("n").Substring(0, 8);

বেশিরভাগ ক্ষেত্রে এটি এখানে historicalতিহাসিক উদ্দেশ্যে রাখা হচ্ছে। এটি সামান্য কম কোড ব্যবহার করে, যদিও এটি কম পরিসীমা থাকার ব্যয় হিসাবে আসে - কারণ এটি বেস 64 এর পরিবর্তে হেক্স ব্যবহার করে অন্যান্য সমাধানগুলির তুলনায় একই পরিসরের প্রতিনিধিত্ব করতে আরও অক্ষর লাগে।

যার অর্থ সংঘর্ষের আরও সম্ভাবনা - এটি 8 টি চরিত্রের স্ট্রিংয়ের 100,000 পুনরাবৃত্তির সাথে পরীক্ষা করে একটি নকল তৈরি করে।


22
আপনি আসলে একটি নকল তৈরি করেছেন? জিআইডি’র সম্ভাব্য সংমিশ্রণে 5,316,911,983,139,663,491,615,228,241,121,400,000 টিতে বিস্মিত Sur
অ্যালেক্স

73
@ অ্যালেক্স: তিনি জিইউইডিটি 8 টি অক্ষরে সংক্ষেপণ করছেন, সুতরাং সংঘর্ষের সম্ভাবনা জিইউইডিগুলির তুলনায় অনেক বেশি।
dtb

23
নার্ড ব্যতীত কেউ এর প্রশংসা করতে পারে না :) হ্যাঁ আপনি একেবারে ঠিক, ৮ টি চর সীমা একটি পার্থক্য করে।
অ্যালেক্স

31
গাইড.নিউইগুইড ()। টুস্ট্রিং ("এন") ড্যাশগুলি বাইরে রাখবে, কোনও প্রতিস্থাপন () কল প্রয়োজন নেই। তবে এটি উল্লেখ করা উচিত, জিইউইডিগুলি কেবল 0-9 এবং এএফ হয়। সংমিশ্রণের সংখ্যা "যথেষ্ট ভাল", তবে সত্যিকারের আলফানিউমেরিক এলোমেলো স্ট্রিং যা অনুমতি দেয় তার কাছাকাছি কোথাও নেই । সংঘর্ষের সম্ভাবনা 1: 4,294,967,296 - এলোমেলো 32-বিট সংখ্যার সমান।
সমৃদ্ধশালী

32
1) জিইউইডিগুলি এলোমেলো নয়, অনন্য হতে ডিজাইন করা হয়েছে। উইন্ডোজের বর্তমান সংস্করণগুলি ভি 4 জিইউডিগুলি উত্পন্ন করে যা সত্যই এলোমেলো, এটির নিশ্চয়তা নেই ed উদাহরণস্বরূপ উইন্ডোজের পুরানো সংস্করণগুলি ভি 1 জিআইডি ব্যবহার করেছে, যেখানে আপনার ব্যর্থ হতে পারে। 2) কেবলমাত্র হেক্স অক্ষরগুলি ব্যবহার করা এলোমেলো স্ট্রিংয়ের গুণমানকে উল্লেখযোগ্যভাবে হ্রাস করে। 47 থেকে 32 বিট পর্যন্ত। 3) লোকেরা সংঘর্ষের সম্ভাবনাটিকে অবমূল্যায়ন করছে, যেহেতু তারা স্বতন্ত্র জোড়গুলির জন্য এটি দেয়। আপনি যদি 100 কে 32 বিট মান উত্পন্ন করেন তবে তাদের মধ্যে সম্ভবত আপনার একটি সংঘর্ষ হবে। জন্মদিনের সমস্যা দেখুন।
কোডসইনচাউস

72

এখানে একটি উদাহরণ যা আমি স্যাম অ্যালেনের উদাহরণ থেকে চুরি করেছি ডট নেট পার্লসে

আপনার যদি কেবলমাত্র 8 টি অক্ষর প্রয়োজন হয় তবে সিস্টেমে Path.GetRandomFileName () ব্যবহার করুন I স্যাম বলেছেন, "এখানে Path.GetRandomFileName পদ্ধতি ব্যবহার করে মাঝে মাঝে উন্নত হয়, কারণ এটি আরও ভাল এলোমেলোতার জন্য আরএনজিক্রিপ্টো সার্ভিস প্রোভাইডার ব্যবহার করে However তবে এটি ১১ টি এলোমেলো অক্ষরে সীমাবদ্ধ।"

GetRandomFileName সর্বদা 9 ম চরিত্রের সময়কাল সহ 12 টি অক্ষরের স্ট্রিং প্রদান করে। সুতরাং আপনাকে পিরিয়ডটি ছাঁটাই করতে হবে (যেহেতু এটি এলোমেলো নয়) এবং তারপরে স্ট্রিং থেকে 8 টি অক্ষর নেওয়া উচিত। আসলে, আপনি কেবল প্রথম 8 টি অক্ষর নিতে পারেন এবং পিরিয়ড সম্পর্কে চিন্তা করবেন না not

public string Get8CharacterRandomString()
{
    string path = Path.GetRandomFileName();
    path = path.Replace(".", ""); // Remove period.
    return path.Substring(0, 8);  // Return 8 character string
}

PS: ধন্যবাদ স্যাম


27
এটি ভাল কাজ করে। আমি এটি 10,000,000 পুনরাবৃত্তির মধ্য দিয়ে চালিয়েছি এবং কখনও কখনও সদৃশ নাম ছিল না। যাইহোক, আমি হয়নি বিভিন্ন অভদ্র শব্দ (ইংরেজীতে) পাবেন। এমনকি তালিকার প্রথমদের মধ্যে একটিতে এফ *** থাকা ছাড়া এটির কথা চিন্তাও করতে হবে না। আপনি যদি কিছু ব্যবহারকারীর দেখতে পাবেন তবে এটি ব্যবহার করুন।
টেকচার্টল

3
@ টেকচারল সতর্কতার জন্য ধন্যবাদ আমি মনে করি বর্ণমালার সমস্ত অক্ষর ব্যবহার করে এমন কোনও এলোমেলো স্ট্রিং প্রজন্মের সাথে অশ্লীল শব্দের ঝুঁকি রয়েছে।
অ্যাডাম পোরাড

সুন্দর এবং সহজ তবে দীর্ঘ স্ট্রিংয়ের পক্ষে ভাল নয় ... এই ভাল
ট্রিকটির

এই পদ্ধতিটি কেবলমাত্র ছোট হাতের অক্ষরগুলিতে ফিরে আসে।
জয়ব্রো

2
সময়ে সময়ে অশ্লীল শব্দ রয়েছে, তবে আপনি যদি এই চালানো দীর্ঘ সময় ধরে রাখেন তবে অবশেষে এটি শেক্সপিয়ার লিখেছেন। (মহাবিশ্বের কয়েকটি জীবনকাল। :)
স্লোথারিও

38

আমার কোডের প্রধান লক্ষ্যগুলি হ'ল:

  1. স্ট্রিংগুলির বিতরণ প্রায় অভিন্ন (ছোট আকারের বিচ্যুতির বিষয়ে চিন্তা করবেন না)
  2. এটি প্রতিটি আর্গুমেন্ট সেটের জন্য কয়েক বিলিয়ন স্ট্রিং আউটপুট দেয়। যদি আপনার পিআরএনজি কেবল 2 বিলিয়ন (এনট্রপির 31 বিট) বিভিন্ন মান উত্পন্ন করে তবে একটি 8 টি অক্ষরের স্ট্রিং (ent 47 বিট ইন্ট্রপির) উত্পন্ন করা অর্থহীন।
  3. এটি সুরক্ষিত, যেহেতু আমি লোকেদের পাসওয়ার্ড বা অন্যান্য সুরক্ষা টোকেনের জন্য এটি ব্যবহার করবে বলে আমি প্রত্যাশা করি।

প্রথম সম্পত্তিটি বর্ণমালার আকারে bit৪ বিট মানের মডুলোর মাধ্যমে অর্জন করা হয়। ছোট বর্ণমালার জন্য (যেমন প্রশ্ন থেকে characters২ টি অক্ষর) এটি নগণ্য পক্ষপাতিত্বের দিকে পরিচালিত করে। দ্বিতীয় এবং তৃতীয় সম্পত্তি RNGCryptoServiceProviderপরিবর্তে ব্যবহার করে অর্জন করা হয় System.Random

using System;
using System.Security.Cryptography;

public static string GetRandomAlphanumericString(int length)
{
    const string alphanumericCharacters =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
        "abcdefghijklmnopqrstuvwxyz" +
        "0123456789";
    return GetRandomString(length, alphanumericCharacters);
}

public static string GetRandomString(int length, IEnumerable<char> characterSet)
{
    if (length < 0)
        throw new ArgumentException("length must not be negative", "length");
    if (length > int.MaxValue / 8) // 250 million chars ought to be enough for anybody
        throw new ArgumentException("length is too big", "length");
    if (characterSet == null)
        throw new ArgumentNullException("characterSet");
    var characterArray = characterSet.Distinct().ToArray();
    if (characterArray.Length == 0)
        throw new ArgumentException("characterSet must not be empty", "characterSet");

    var bytes = new byte[length * 8];
    var result = new char[length];
    using (var cryptoProvider = new RNGCryptoServiceProvider())
    {
        cryptoProvider.GetBytes(bytes);
    }
    for (int i = 0; i < length; i++)
    {
        ulong value = BitConverter.ToUInt64(bytes, i * 8);
        result[i] = characterArray[value % (uint)characterArray.Length];
    }
    return new string(result);
}

1
64 x জেড এবং ম্যাথ.প্যাও (2, Y) দিয়ে কোনও ছেদ নেই। সুতরাং বড় সংখ্যা তৈরি করার সময় পক্ষপাত হ্রাস হয়, এটি এটি সরিয়ে দেয় না। আমি নীচে আমার উত্তরটি আপডেট করেছিলাম, আমার পদ্ধতির র্যান্ডম ইনপুটগুলি বাতিল করা এবং অন্য কোনও মান দিয়ে প্রতিস্থাপন করা ছিল।
টড

@ টড আমি জানি যে এটি পক্ষপাত দূর করে না, তবে আমি ব্যবহারিকভাবে অপ্রাসঙ্গিক পক্ষপাত দূর করার চেয়ে এই সমাধানটির সরলতা বেছে নিয়েছি।
কোডসইনচাউস

আমি বেশিরভাগ ক্ষেত্রে সম্মত হই এটি সম্ভবত ব্যবহারিকভাবে অপ্রাসঙ্গিক। তবে এখন আমি আমার হালনাগাদ হিসাবে দ্রুত এবং আপনার চেয়ে একটু বেশি সুরক্ষিত উভয় হিসাবে আপডেট হয়েছে। সবার ভাগ করে নেওয়ার জন্য সমস্ত ওপেন সোর্স। হ্যাঁ, আমি এতে খুব বেশি সময় নষ্ট করেছি ...
টড

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

1
@ ম্যাক্সিম আপনি পক্ষপাত সম্পূর্ণরূপে নির্মূল করতে প্রত্যাখ্যান ব্যবহার করতে পারেন (ধরে নিচ্ছেন অন্তর্নিহিত জেনারেটরটি পুরোপুরি এলোমেলো) is বিনিময়ে কোডটি নির্বিচারে দীর্ঘ চলতে পারে (তাত্পর্যপূর্ণ ছোট সম্ভাবনার সাথে)।
কোডসইনচাউস

32

সহজতম:

public static string GetRandomAlphaNumeric()
{
    return Path.GetRandomFileName().Replace(".", "").Substring(0, 8);
}

আপনি যদি চরের অ্যারেটিকে হার্ড কোড করে এবং নির্ভর করে থাকেন তবে আপনি আরও ভাল পারফরম্যান্স পেতে পারেন System.Random:

public static string GetRandomAlphaNumeric()
{
    var chars = "abcdefghijklmnopqrstuvwxyz0123456789";
    return new string(chars.Select(c => chars[random.Next(chars.Length)]).Take(8).ToArray());
}

যদি কখনও আপনি উদ্বেগ প্রকাশ করেন যে ইংরেজি বর্ণমালা কিছু সময় পরিবর্তিত হতে পারে এবং আপনি ব্যবসায় হারাতে পারেন, তবে আপনি কঠোর কোডিং এড়াতে পারবেন, তবে কিছুটা খারাপ সঞ্চালন করতে হবে ( Path.GetRandomFileNameকাছে যাওয়ার তুলনায় )

public static string GetRandomAlphaNumeric()
{
    var chars = 'a'.To('z').Concat('0'.To('9')).ToList();
    return new string(chars.Select(c => chars[random.Next(chars.Length)]).Take(8).ToArray());
}

public static IEnumerable<char> To(this char start, char end)
{
    if (end < start)
        throw new ArgumentOutOfRangeException("the end char should not be less than start char", innerException: null);
    return Enumerable.Range(start, end - start + 1).Select(i => (char)i);
}

আপনি যদি System.Randomউদাহরণস্বরূপ এগুলিকে একটি এক্সটেনশন পদ্ধতিতে তৈরি করতে পারেন তবে শেষ দুটি পদ্ধতির আরও ভাল দেখায় ।


1
ব্যবহার chars.Selectআউটপুট আকারের সর্বাধিক বর্ণমালার আকারের উপর নির্ভর করে যেহেতু এটি একটি বড় কুরুচিপূর্ণ।
কোডসইনচওস

@ কোডস ইনচাউস আমি নিশ্চিত না আমি আপনাকে বুঝতে পেরেছি কিনা। আপনি 'a'.To('z')পদ্ধতির মানে ?
নওফাল

1
1) chars.Select().টেক (এন) works কেবলমাত্র যদি কাজ করে chars.Count >= n। আপনি যে ক্রমটি ব্যবহার করছেন না সেটি বেছে নেওয়া কিছুটা অল্পক্ষণের, বিশেষত এই সংক্ষিপ্ত দৈর্ঘ্যের সীমাবদ্ধতার সাথে। আমি বরং ব্যবহার করতে চাই Enumerable.Rangeবা Enumerable.Repeat। 2) ত্রুটি বার্তা "শেষ চরটি শুরু চরের তুলনায় কম হওয়া উচিত" এটি ভুল উপায়ে গোল / মিসিং এ not
কোডসইনচওস

@ কোডস ইনচাউস তবে আমার ক্ষেত্রে chars.Countএটি উপায় > n। এছাড়াও আমি অনিশ্চিত অংশ পেতে চাই না। এটি সমস্ত ব্যবহারগুলিকে Takeঅনিচ্ছাকৃত করে তোলে না? আমি এটা বিশ্বাস করি না। টাইপো নির্দেশ করার জন্য ধন্যবাদ।
নওফাল

4
এটি কোডসওড নিবন্ধ হিসাবে ডেইলিডব্লিউটিএফ.কম এ বৈশিষ্ট্যযুক্ত ।

22

এই থ্রেডের বিভিন্ন উত্তরের তুলনায় কেবল কয়েকটি পারফরম্যান্স:

পদ্ধতি এবং সেটআপ

// what's available
public static string possibleChars = "abcdefghijklmnopqrstuvwxyz";
// optimized (?) what's available
public static char[] possibleCharsArray = possibleChars.ToCharArray();
// optimized (precalculated) count
public static int possibleCharsAvailable = possibleChars.Length;
// shared randomization thingy
public static Random random = new Random();


// http://stackoverflow.com/a/1344242/1037948
public string LinqIsTheNewBlack(int num) {
    return new string(
    Enumerable.Repeat(possibleCharsArray, num)
              .Select(s => s[random.Next(s.Length)])
              .ToArray());
}

// http://stackoverflow.com/a/1344258/1037948
public string ForLoop(int num) {
    var result = new char[num];
    while(num-- > 0) {
        result[num] = possibleCharsArray[random.Next(possibleCharsAvailable)];
    }
    return new string(result);
}

public string ForLoopNonOptimized(int num) {
    var result = new char[num];
    while(num-- > 0) {
        result[num] = possibleChars[random.Next(possibleChars.Length)];
    }
    return new string(result);
}

public string Repeat(int num) {
    return new string(new char[num].Select(o => possibleCharsArray[random.Next(possibleCharsAvailable)]).ToArray());
}

// http://stackoverflow.com/a/1518495/1037948
public string GenerateRandomString(int num) {
  var rBytes = new byte[num];
  random.NextBytes(rBytes);
  var rName = new char[num];
  while(num-- > 0)
    rName[num] = possibleCharsArray[rBytes[num] % possibleCharsAvailable];
  return new string(rName);
}

//SecureFastRandom - or SolidSwiftRandom
static string GenerateRandomString(int Length) //Configurable output string length
{
    byte[] rBytes = new byte[Length]; 
    char[] rName = new char[Length];
    SolidSwiftRandom.GetNextBytesWithMax(rBytes, biasZone);
    for (var i = 0; i < Length; i++)
    {
        rName[i] = charSet[rBytes[i] % charSet.Length];
    }
    return new string(rName);
}

ফলাফল

লিনকপ্যাডে পরীক্ষিত। স্ট্রিং আকারের জন্য 10, উত্পন্ন:

  • লিনক থেকে = chdgmevhcy [10]
  • লুপ থেকে = gtnoaryhxr [10]
  • নির্বাচন থেকে = আরএসডিবিজেটিবি [10]
  • জেনারেটর্যান্ডমস্ট্রিং থেকে = owyefjjakj [10]
  • সিকিউরফাস্টআর্যান্ডম থেকে = ভজগলিওয়াইওয়াইপি [10]
  • SecureFastRandom-NoCache = oVQXNGmO1S থেকে [10]

এবং পারফরম্যান্সের সংখ্যাগুলি কিছুটা পরিবর্তিত হয়, খুব মাঝেমধ্যে খুব NonOptimizedদ্রুত হয়, এবং কখনও কখনও ForLoopএবং GenerateRandomStringনেতৃত্বে কে আছে তা পরিবর্তন করে।

  • লিনকআইএসনিউব্ল্যাক (10000x) = 96762 টিকগুলি বিচ্ছিন্ন হয়েছে (9.6762 এমএস)
  • ফর্মলুপ (10000x) = 28970 টিক্স কেটে গেছে (2.897 এমএস)
  • ফরলুপনঅন্টিপিমাইজড (10000x) = 33336 টিকগুলি বিচ্ছিন্ন হয়েছে (3.3336 এমএস)
  • পুনরাবৃত্তি (10000x) = 78547 টিক্স কেটে গেছে (7.8547 এমএস)
  • জেনারেটর্যান্ডমস্ট্রিং (10000x) = 27416 টিক্স বিচ্ছিন্ন হয়েছে (2.7416 এমএস)
  • SecureFastRandom (10000x) = 13176 টিকগুলি সর্বনিম্ন (5 মিমি) সর্বনিম্ন [বিভিন্ন মেশিন]
  • SecureFastRandom-NoCache (10000x) = 39541 টিকগুলি সর্বনিম্ন (17 মাইল) অতিবাহিত হয়েছে [ভিন্ন মেশিন]

3
কোনটি দুগ্ধ তৈরি করেছে তা জানতে আগ্রহী হবে।
রেবেকা

@ জন্টো - ডুপ্লিকেটগুলির ফলাফল কী, এমন var many = 10000; Assert.AreEqual(many, new bool[many].Select(o => EachRandomizingMethod(10)).Distinct().Count());EachRandomizingMethod
কোনও কিছুর

19

কোডের একটি লাইন Membership.GeneratePassword()কৌতুক করে :)

এখানে একই জন্য একটি ডেমো


1
মাইক্রোসফট মত দেখায় লিংক সরানো .. আরেকটি কোডের নমুনা এ msdn.microsoft.com/en-us/library/ms152017 বা aspnet.4guysfromrolla.com/demos/GeneratePassword.aspx বা developer.xamarin.com/api/member/...
পুরাণ

আমি এটি ভেবেছিলাম কিন্তু অ
অক্ষিত

13

এরিক জে রচিত কোডটি বেশ আড়ম্বরপূর্ণ (এটি পুরোপুরি স্পষ্ট যে এটি 6 বছর আগের থেকে ... তিনি সম্ভবত আজ সেই কোডটি লিখতেন না), এবং আরও কিছু সমস্যা রয়েছে।

উপস্থাপিত কিছু বিকল্পের বিপরীতে, এটি হ'ল ক্রিপ্টোগ্রাফিকভাবে সাবলীল।

অস্পষ্ট ... পাসওয়ার্ডে একটি পক্ষপাত রয়েছে (যেমন একটি মন্তব্যে লেখা আছে), bcdefghঅন্যদের তুলনায় কিছুটা বেশি সম্ভাবনা রয়েছে ( aকারণ GetNonZeroBytesএটি শূন্যের মান সহ বাইট তৈরি করে না, তাই পক্ষপাতিত্ব জন্য a) এটি দ্বারা সুষম হয়, তাই এটি সত্যিই ক্রিপ্টোগ্রাফি শব্দ নয়।

এটি সমস্ত সমস্যা সংশোধন করা উচিত।

public static string GetUniqueKey(int size = 6, string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
{
    using (var crypto = new RNGCryptoServiceProvider())
    {
        var data = new byte[size];

        // If chars.Length isn't a power of 2 then there is a bias if
        // we simply use the modulus operator. The first characters of
        // chars will be more probable than the last ones.

        // buffer used if we encounter an unusable random byte. We will
        // regenerate it in this buffer
        byte[] smallBuffer = null;

        // Maximum random number that can be used without introducing a
        // bias
        int maxRandom = byte.MaxValue - ((byte.MaxValue + 1) % chars.Length);

        crypto.GetBytes(data);

        var result = new char[size];

        for (int i = 0; i < size; i++)
        {
            byte v = data[i];

            while (v > maxRandom)
            {
                if (smallBuffer == null)
                {
                    smallBuffer = new byte[1];
                }

                crypto.GetBytes(smallBuffer);
                v = smallBuffer[0];
            }

            result[i] = chars[v % chars.Length];
        }

        return new string(result);
    }
}

7

আমরা কাস্টম স্ট্রিং এলোমেলোভাবে ব্যবহার করি তবে আমরা প্রয়োগ করেছি স্ট্রিংয়ের সহায়ক হিসাবে তাই এটি কিছুটা নমনীয়তা সরবরাহ করে ...

public static string Random(this string chars, int length = 8)
{
    var randomString = new StringBuilder();
    var random = new Random();

    for (int i = 0; i < length; i++)
        randomString.Append(chars[random.Next(chars.Length)]);

    return randomString.ToString();
}

ব্যবহার

var random = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Random();

অথবা

var random = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".Random(16);

7

আমার সাধারণ একটি লাইন কোডটি আমার জন্য কাজ করে :)

string  random = string.Join("", Guid.NewGuid().ToString("n").Take(8).Select(o => o));

Response.Write(random.ToUpper());
Response.Write(random.ToLower());

যে কোনও দৈর্ঘ্যের স্ট্রিংয়ের জন্য এটিতে প্রসারিত করুন

    public static string RandomString(int length)
    {
        //length = length < 0 ? length * -1 : length;
        var str = "";

        do 
        {
            str += Guid.NewGuid().ToString().Replace("-", "");
        }

        while (length > str.Length);

        return str.Substring(0, length);
    }

আমি
গাইডের

6

আরেকটি বিকল্প হ'ল লিনক এবং সামগ্রিক র্যান্ডম চরগুলি স্ট্রিংবিল্ডারে ব্যবহার করা।

var chars = "abcdefghijklmnopqrstuvwxyz123456789".ToArray();
string pw = Enumerable.Range(0, passwordLength)
                      .Aggregate(
                          new StringBuilder(),
                          (sb, n) => sb.Append((chars[random.Next(chars.Length)])),
                          sb => sb.ToString());

6

প্রশ্ন: আমার Enumerable.Rangeটাইপ না করে আমার সময় নষ্ট করা উচিত কেন "ABCDEFGHJKLMNOPQRSTUVWXYZ0123456789"?

using System;
using System.Collections.Generic;
using System.Linq;

public class Test
{
    public static void Main()
    {
        var randomCharacters = GetRandomCharacters(8, true);
        Console.WriteLine(new string(randomCharacters.ToArray()));
    }

    private static List<char> getAvailableRandomCharacters(bool includeLowerCase)
    {
        var integers = Enumerable.Empty<int>();
        integers = integers.Concat(Enumerable.Range('A', 26));
        integers = integers.Concat(Enumerable.Range('0', 10));

        if ( includeLowerCase )
            integers = integers.Concat(Enumerable.Range('a', 26));

        return integers.Select(i => (char)i).ToList();
    }

    public static IEnumerable<char> GetRandomCharacters(int count, bool includeLowerCase)
    {
        var characters = getAvailableRandomCharacters(includeLowerCase);
        var random = new Random();
        var result = Enumerable.Range(0, count)
            .Select(_ => characters[random.Next(characters.Count)]);

        return result;
    }
}

উত্তর: যাদু স্ট্রিংগুলি খারাপ কেউ কি লক্ষ্য করেছেন "Iআমার স্ট্রিংয়ের শীর্ষে " করেছে? আমার মা আমাকে এই কারণেই ম্যাজিক স্ট্রিং ব্যবহার না করা শিখিয়েছিলেন ...

এনবি 1: @dtb এর মতো আরও অনেকে বলেছেন, আপনার System.Randomযদি ক্রিপ্টোগ্রাফিক সুরক্ষা প্রয়োজন হয় তবে ব্যবহার করবেন না ...

এনবি 2: এই উত্তরটি সবচেয়ে দক্ষ বা সংক্ষিপ্ত নয়, তবে আমি উত্তরটি প্রশ্ন থেকে পৃথক করতে চেয়েছি। আমার উত্তরের উদ্দেশ্যটি অভিনব উদ্ভাবনী উত্তর দেওয়ার চেয়ে যাদু স্ট্রিংয়ের বিরুদ্ধে সতর্ক করা।


আমি কেন যত্ন নেই যে "নেই I?"
ক্রিস্টিন

1
বর্ণমালা (উপেক্ষা কেস) হয় [A-Z0-9]। যদি, দুর্ঘটনাক্রমে, আপনার এলোমেলো স্ট্রিংটি কেবল কখনই [A-HJ-Z0-9]ফলাফলকে আচ্ছাদিত করে পুরো অনুমোদিত মঞ্জুরির সীমাটি কভার করে না, যা সমস্যাযুক্ত হতে পারে।
ওয়াই হা লি

কীভাবে সমস্যা হবে? সুতরাং এটি ধারণ করে না I। এটি কি কারণ এর চেয়ে কম চরিত্র আছে এবং এটি ক্র্যাক করা সহজ করে তোলে? ক্র্যাকযোগ্য পাসওয়ার্ডগুলির পরিসংখ্যানগুলি কীভাবে ৩ 36 টির চেয়ে বেশি সীমাতে ৩ characters টি অক্ষর রয়েছে I তবে, আমিই। আমি বলতে চাইছি বাট গর্ত হবে না, আমি কেবল বলছি। কখনও কখনও আমি মনে করি প্রোগ্রামারদের অতিরিক্ত-জটিল হওয়ার জন্য অতিরিক্ত জটিল পথে যাওয়ার প্রবণতা রয়েছে।
ক্রিস্টিন

1
এটি ব্যবহারের ক্ষেত্রে নির্ভর করে। এটা খুবই যেমন অক্ষর বাদ দেওয়ার সাধারণ Iএবং Oর্যান্ডম স্ট্রিং এই ধরনের তাদের সঙ্গে বিভ্রান্তিকর মানুষের এড়াতে 1এবং 0। যদি আপনি মানব-পঠনযোগ্য স্ট্রিং সম্পর্কে চিন্তা না করেন তবে ভাল, তবে এটি যদি কারও কাছে টাইপ করার দরকার হয় তবে এই অক্ষরগুলি সরিয়ে ফেলা আসলে স্মার্ট।
ক্রিস প্র্যাট

5

ডিটিবি এর সমাধানের একটি সামান্য ক্লিনার সংস্করণ।

    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    var random = new Random();
    var list = Enumerable.Repeat(0, 8).Select(x=>chars[random.Next(chars.Length)]);
    return string.Join("", list);

আপনার শৈলীর পছন্দগুলি পৃথক হতে পারে।


এটি গৃহীত উত্তরের চেয়ে অনেক বেশি ভাল এবং দক্ষ।
ওয়েজ

5
 public static string RandomString(int length)
    {
        const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        var random = new Random();
        return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray());
    }

5

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

এই কোডটির একটি আধুনিক সংস্করণের জন্য, দয়া করে বিটবুকিতে নতুন এইচজি সংগ্রহস্থলটি দেখুন: https://bitbucket.org/merarischroeder/secureswiftrandom । আমি আপনাকে কোডটি অনুলিপি করে আটকানোর পরামর্শ দিচ্ছি: https://bitbucket.org/merarischroeder/secureswiftrandom/src/6c14b874f34a3f6576b0213379ecdf0ffc7496ea/Code/Alivate.SolidSwiftRandom/SolidSwatRideomffflflfl=flout/ (নিশ্চিত করুন যে আপনি ক্লিক অনুলিপি করা এবং আপনার কাছে সর্বশেষতম সংস্করণ রয়েছে তা নিশ্চিত করার জন্য কাঁচা বোতামটি, আমি মনে করি এই লিঙ্কটি কোডটির একটি নির্দিষ্ট সংস্করণে গেছে, সর্বশেষটি নয়)।

আপডেট করা নোট:

  1. কিছু অন্যান্য উত্তরের সাথে সম্পর্কিত - যদি আপনি আউটপুটটির দৈর্ঘ্য জানেন তবে আপনার স্ট্রিংবিল্ডারের প্রয়োজন হবে না এবং টোচারআরে ব্যবহার করার সময় এটি অ্যারে তৈরি করে এবং পূরণ করে (আপনাকে প্রথমে খালি অ্যারে তৈরি করার দরকার নেই)
  2. কিছু অন্যান্য উত্তরের সাথে সম্পর্কিত - আপনার একবারে পারফরম্যান্সের জন্য পাওয়ার চেয়ে নেক্সটবাইট ব্যবহার করা উচিত
  3. প্রযুক্তিগতভাবে আপনি দ্রুত অ্যাক্সেসের জন্য বাইট অ্যারেটি পিন করতে পারেন .. যখন আপনার বাইট অ্যারের উপরে 6-8 বারের বেশি পুনরাবৃত্তি হয় তখন এটি সার্থক হয়। (এখানে করা হয়নি)
  4. সেরা এলোমেলো করার জন্য আরএনজিক্রিপ্টো সার্ভিস প্রোভাইডার ব্যবহার করুন
  5. ব্যবহারের র্যান্ডম ডেটার একটি 1MB বাফার ক্যাশে - শো মাপকাঠিতে ক্যাশে একক বাইট সংযোগের গতি ~ 1000x দ্রুততর - uncached জন্য 989ms বনাম 1MB উপর 9ms গ্রহণ।
  6. আমার নতুন শ্রেণীর মধ্যে পক্ষপাতদুষ্ট অঞ্চলটিকে অনুকূলিতকরণ প্রত্যাখ্যান

প্রশ্নের শেষ সমাধান:

static char[] charSet =  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".ToCharArray();
static int byteSize = 256; //Labelling convenience
static int biasZone = byteSize - (byteSize % charSet.Length);
public string GenerateRandomString(int Length) //Configurable output string length
{
    byte[] rBytes = new byte[Length]; //Do as much before and after lock as possible
    char[] rName = new char[Length];
    SecureFastRandom.GetNextBytesMax(rBytes, biasZone);
    for (var i = 0; i < Length; i++)
    {
        rName[i] = charSet[rBytes[i] % charSet.Length];
    }
    return new string(rName);
}

তবে আপনার আমার নতুন (অনির্ধারিত) শ্রেণি দরকার:

/// <summary>
/// My benchmarking showed that for RNGCryptoServiceProvider:
/// 1. There is negligable benefit of sharing RNGCryptoServiceProvider object reference 
/// 2. Initial GetBytes takes 2ms, and an initial read of 1MB takes 3ms (starting to rise, but still negligable)
/// 2. Cached is ~1000x faster for single byte at a time - taking 9ms over 1MB vs 989ms for uncached
/// </summary>
class SecureFastRandom
{
    static byte[] byteCache = new byte[1000000]; //My benchmark showed that an initial read takes 2ms, and an initial read of this size takes 3ms (starting to raise)
    static int lastPosition = 0;
    static int remaining = 0;

    /// <summary>
    /// Static direct uncached access to the RNGCryptoServiceProvider GetBytes function
    /// </summary>
    /// <param name="buffer"></param>
    public static void DirectGetBytes(byte[] buffer)
    {
        using (var r = new RNGCryptoServiceProvider())
        {
            r.GetBytes(buffer);
        }
    }

    /// <summary>
    /// Main expected method to be called by user. Underlying random data is cached from RNGCryptoServiceProvider for best performance
    /// </summary>
    /// <param name="buffer"></param>
    public static void GetBytes(byte[] buffer)
    {
        if (buffer.Length > byteCache.Length)
        {
            DirectGetBytes(buffer);
            return;
        }

        lock (byteCache)
        {
            if (buffer.Length > remaining)
            {
                DirectGetBytes(byteCache);
                lastPosition = 0;
                remaining = byteCache.Length;
            }

            Buffer.BlockCopy(byteCache, lastPosition, buffer, 0, buffer.Length);
            lastPosition += buffer.Length;
            remaining -= buffer.Length;
        }
    }

    /// <summary>
    /// Return a single byte from the cache of random data.
    /// </summary>
    /// <returns></returns>
    public static byte GetByte()
    {
        lock (byteCache)
        {
            return UnsafeGetByte();
        }
    }

    /// <summary>
    /// Shared with public GetByte and GetBytesWithMax, and not locked to reduce lock/unlocking in loops. Must be called within lock of byteCache.
    /// </summary>
    /// <returns></returns>
    static byte UnsafeGetByte()
    {
        if (1 > remaining)
        {
            DirectGetBytes(byteCache);
            lastPosition = 0;
            remaining = byteCache.Length;
        }

        lastPosition++;
        remaining--;
        return byteCache[lastPosition - 1];
    }

    /// <summary>
    /// Rejects bytes which are equal to or greater than max. This is useful for ensuring there is no bias when you are modulating with a non power of 2 number.
    /// </summary>
    /// <param name="buffer"></param>
    /// <param name="max"></param>
    public static void GetBytesWithMax(byte[] buffer, byte max)
    {
        if (buffer.Length > byteCache.Length / 2) //No point caching for larger sizes
        {
            DirectGetBytes(buffer);

            lock (byteCache)
            {
                UnsafeCheckBytesMax(buffer, max);
            }
        }
        else
        {
            lock (byteCache)
            {
                if (buffer.Length > remaining) //Recache if not enough remaining, discarding remaining - too much work to join two blocks
                    DirectGetBytes(byteCache);

                Buffer.BlockCopy(byteCache, lastPosition, buffer, 0, buffer.Length);
                lastPosition += buffer.Length;
                remaining -= buffer.Length;

                UnsafeCheckBytesMax(buffer, max);
            }
        }
    }

    /// <summary>
    /// Checks buffer for bytes equal and above max. Must be called within lock of byteCache.
    /// </summary>
    /// <param name="buffer"></param>
    /// <param name="max"></param>
    static void UnsafeCheckBytesMax(byte[] buffer, byte max)
    {
        for (int i = 0; i < buffer.Length; i++)
        {
            while (buffer[i] >= max)
                buffer[i] = UnsafeGetByte(); //Replace all bytes which are equal or above max
        }
    }
}

ইতিহাসের জন্য - এই উত্তরের জন্য আমার পুরানো সমাধান, ব্যবহৃত এলোমেলো বস্তু:

    private static char[] charSet =
      "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".ToCharArray();

    static rGen = new Random(); //Must share, because the clock seed only has Ticks (~10ms) resolution, yet lock has only 20-50ns delay.
    static int byteSize = 256; //Labelling convenience
    static int biasZone = byteSize - (byteSize % charSet.Length);
    static bool SlightlyMoreSecurityNeeded = true; //Configuration - needs to be true, if more security is desired and if charSet.Length is not divisible by 2^X.
    public string GenerateRandomString(int Length) //Configurable output string length
    {
      byte[] rBytes = new byte[Length]; //Do as much before and after lock as possible
      char[] rName = new char[Length];
      lock (rGen) //~20-50ns
      {
          rGen.NextBytes(rBytes);

          for (int i = 0; i < Length; i++)
          {
              while (SlightlyMoreSecurityNeeded && rBytes[i] >= biasZone) //Secure against 1/5 increased bias of index[0-7] values against others. Note: Must exclude where it == biasZone (that is >=), otherwise there's still a bias on index 0.
                  rBytes[i] = rGen.NextByte();
              rName[i] = charSet[rBytes[i] % charSet.Length];
          }
      }
      return new string(rName);
    }

কর্মক্ষমতা:

  1. SecureFastRandom - প্রথম একক রান = ~ 9-33ms । অদৃশ্য। চলমান : 5 মিমি (কখনও কখনও এটি 13 মিমি পর্যন্ত যায়) 10,000 একক পুনরাবৃত্তির সাথে, একক গড় পুনরাবৃত্তি = 1.5 মাইক্রোসেকেন্ড সহ। । দ্রষ্টব্য: সাধারণত 2 টি প্রয়োজন, তবে মাঝে মাঝে 8 টি ক্যাশে রিফ্রেশ হয় - কতগুলি একক বাইট বায়াস জোন অতিক্রম করে তার উপর নির্ভর করে
  2. এলোমেলো - প্রথম একক রান = ~ 0-1ms । অদৃশ্য। চলমান : 10,000 ম্যাসেজের বেশি 5 মিমি । একক গড় পুনরাবৃত্তি = .5 মাইক্রোসেকেন্ড সহ। । একই গতি সম্পর্কে।

এছাড়াও চেক আউট:

এই লিঙ্কগুলি অন্য পদ্ধতি। এই নতুন কোড বেসে বাফারিং যুক্ত করা যেতে পারে তবে সবচেয়ে গুরুত্বপূর্ণ ছিল পক্ষপাত অপসারণের জন্য বিভিন্ন পদ্ধতির অন্বেষণ করা এবং গতি এবং উপকারগুলি / বিপরীতে চিহ্নিত করা।


- আমি তোমার পদ্ধতি, যা গুচ্ছ উপবাস করলো কিছু অসম্মান কর্মক্ষমতা উন্নত পাওয়া stackoverflow.com/a/17092645/1037948
drzaus

5
1) কেন এই সমস্ত ম্যাজিক ধ্রুবক? আপনি তিনবার আউটপুট দৈর্ঘ্য নির্দিষ্ট করেছেন । কেবল এটিকে ধ্রুবক বা পরামিতি হিসাবে সংজ্ঞায়িত করুন। আপনি charSet.Lengthপরিবর্তে ব্যবহার করতে পারেন 62। 2) Randomলকিং ছাড়াই স্থির অর্থ এই কোডটি থ্রেডসেফ নয়। 3) 0-255 মড 62 হ্রাস একটি সনাক্তকারী পক্ষপাতের পরিচয় দেয়। 4) আপনি ToStringকোনও চর অ্যারে ব্যবহার করতে পারবেন না , যা সর্বদা ফিরে আসে "System.Char[]"new String(rName)পরিবর্তে আপনার ব্যবহার করা উচিত।
কোডসইনচওস

ধন্যবাদ @ কোডস ইন চ্যাওস, আমি কখনই সেই জিনিসগুলির কথা ভাবিনি। এখনও কেবল র্যান্ডম ক্লাস ব্যবহার করা হচ্ছে তবে এটি আরও ভাল হওয়া উচিত। পক্ষপাত ইনপুট সনাক্ত এবং সঠিক করার জন্য এর চেয়ে ভাল আরও কোন উপায় আমি ভাবতে পারি নি।
টড

কোনও দুর্বল আরএনজি ( System.Random) দিয়ে শুরু করা এবং তারপরে সতর্কতার সাথে আপনার নিজের কোডের কোনও পক্ষপাত এড়ানো কিছুটা নির্বোধ । "একটি টারডকে পোলিশ করা" অভিব্যক্তিটি মনে আসে।
কোডসইনচাউস

@ কোডসইন চাওস এবং এখন শিক্ষানবিশ তার মাস্টারকে ছাড়িয়ে গেছে
টড

4

ভয়াবহ, আমি জানি, কিন্তু আমি কেবল নিজেকে সাহায্য করতে পারি না:


namespace ConsoleApplication2
{
    using System;
    using System.Text.RegularExpressions;

    class Program
    {
        static void Main(string[] args)
        {
            Random adomRng = new Random();
            string rndString = string.Empty;
            char c;

            for (int i = 0; i < 8; i++)
            {
                while (!Regex.IsMatch((c=Convert.ToChar(adomRng.Next(48,128))).ToString(), "[A-Za-z0-9]"));
                rndString += c;
            }

            Console.WriteLine(rndString + Environment.NewLine);
        }
    }
}


4

আমি আরও সুনির্দিষ্ট উত্তর খুঁজছিলাম, যেখানে আমি এলোমেলো স্ট্রিংয়ের ফর্ম্যাটটি নিয়ন্ত্রণ করতে চাই এবং এই পোস্টটি জুড়ে এসেছি। উদাহরণস্বরূপ: লাইসেন্স প্লেটগুলির (গাড়ির) একটি নির্দিষ্ট বিন্যাস রয়েছে (প্রতি দেশ) এবং আমি এলোমেলো লাইসেন্স প্লেট তৈরি করতে চেয়েছিলাম।
আমি এটির জন্য আমার নিজস্ব বর্ধিত পদ্ধতি লিখতে সিদ্ধান্ত নিয়েছি। (এটি একই র্যান্ডম অবজেক্টটি পুনরায় ব্যবহার করার জন্য যাতে আপনার বহু-থ্রেডিং দৃশ্যে দ্বিগুণ থাকতে পারে)। আমি একটি গিস্ট তৈরি করেছি ( https://gist.github.com/SamVanhoutte/808845ca78b9c041e928 ), তবে এখানে এক্সটেনশন ক্লাসটিও অনুলিপি করব:

void Main()
{
    Random rnd = new Random();
    rnd.GetString("1-###-000").Dump();
}

public static class RandomExtensions
{
    public static string GetString(this Random random, string format)
    {
        // Based on http://stackoverflow.com/questions/1344221/how-can-i-generate-random-alphanumeric-strings-in-c
        // Added logic to specify the format of the random string (# will be random string, 0 will be random numeric, other characters remain)
        StringBuilder result = new StringBuilder();
        for(int formatIndex = 0; formatIndex < format.Length ; formatIndex++)
        {
            switch(format.ToUpper()[formatIndex])
            {
                case '0': result.Append(getRandomNumeric(random)); break;
                case '#': result.Append(getRandomCharacter(random)); break;
                default : result.Append(format[formatIndex]); break;
            }
        }
        return result.ToString();
    }

    private static char getRandomCharacter(Random random)
    {
        string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        return chars[random.Next(chars.Length)];
    }

    private static char getRandomNumeric(Random random)
    {
        string nums = "0123456789";
        return nums[random.Next(nums.Length)];
    }
}

4

এখন ওয়ান লাইনারের স্বাদে।

private string RandomName()
{
        return new string(
            Enumerable.Repeat("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 13)
                .Select(s =>
                {
                    var cryptoResult = new byte[4];
                    using (var cryptoProvider = new RNGCryptoServiceProvider())
                        cryptoProvider.GetBytes(cryptoResult);

                    return s[new Random(BitConverter.ToInt32(cryptoResult, 0)).Next(s.Length)];
                })
                .ToArray());
}

2
এমন কোনও কিছুর জন্য সম্পত্তি ব্যবহার করা যা প্রতিটি অ্যাক্সেসের পরিবর্তিত হয় সন্দেহজনক। আমি এর পরিবর্তে কোনও পদ্ধতি ব্যবহার করার পরামর্শ দেব।
কোডসইনচওস

2
RNGCryptoServiceProviderব্যবহারের পরে নিষ্পত্তি করা উচিত।
সোশি আশের

আমি আইডিস্পোজেবল সমস্যাটি স্থির করেছি, তবে এটি এখনও অত্যন্ত সন্দেহজনক, প্রতিটি চিঠির জন্য একটি নতুন আরএনজিক্রিপ্টো সার্ভিস প্রোভাইডার তৈরি করে।
piojo

@ কোডস ইনচোস সম্পন্ন হয়েছে, এখন একটি পদ্ধতি।
মাতাস ভাইটকেভিচিয়াস

3

দুটি অংশ একত্রিত করার চেষ্টা করুন: অনন্য (ক্রম, পাল্টা বা তারিখ) এবং এলোমেলো

public class RandomStringGenerator
{
    public static string Gen()
    {
        return ConvertToBase(DateTime.UtcNow.ToFileTimeUtc()) + GenRandomStrings(5); //keep length fixed at least of one part
    }

    private static string GenRandomStrings(int strLen)
    {
        var result = string.Empty;

        var Gen = new RNGCryptoServiceProvider();
        var data = new byte[1];

        while (result.Length < strLen)
        {
            Gen.GetNonZeroBytes(data);
            int code = data[0];
            if (code > 48 && code < 57 || // 0-9
                code > 65 && code < 90 || // A-Z
                code > 97 && code < 122   // a-z
                )
            {
                result += Convert.ToChar(code);
            }
        }

        return result;
    }

    private static string ConvertToBase(long num, int nbase = 36)
    {
        var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //if you wish make algorithm more secure - change order of letter here

        // check if we can convert to another base
        if (nbase < 2 || nbase > chars.Length)
            return null;

        int r;
        var newNumber = string.Empty;

        // in r we have the offset of the char that was converted to the new base
        while (num >= nbase)
        {
            r = (int) (num % nbase);
            newNumber = chars[r] + newNumber;
            num = num / nbase;
        }
        // the last number to convert
        newNumber = chars[(int)num] + newNumber;

        return newNumber;
    }
}

পরীক্ষা:

[Test]
    public void Generator_Should_BeUnigue1()
    {
        //Given
        var loop = Enumerable.Range(0, 1000);
        //When
        var str = loop.Select(x=> RandomStringGenerator.Gen());
        //Then
        var distinct = str.Distinct();
        Assert.AreEqual(loop.Count(),distinct.Count()); // Or Assert.IsTrue(distinct.Count() < 0.95 * loop.Count())
    }

1) আপনি এই অক্ষরগুলির সাথে সম্পর্কিত ASCII মানগুলির পরিবর্তে অক্ষর অক্ষর ব্যবহার করতে পারেন। 2) আপনার বিরতি ম্যাচিং কোডে আপনার বাইরের একটি ভুল রয়েছে। আপনি ব্যবহার করতে হবে <=এবং >=পরিবর্তে <এবং >। 3) আমি &&প্রকাশের চারপাশে অপ্রয়োজনীয় প্রথম বন্ধনী যুক্ত করলাম এটি পরিষ্কার করার জন্য যে তাদের অগ্রাধিকার রয়েছে, তবে অবশ্যই এটি কেবল একটি স্টাইলিস্টিক পছন্দ।
কোডসইনচওস

+ 1 পক্ষপাতিত্ব অপসারণ এবং পরীক্ষা যোগ করার জন্য ভাল। আমি নিশ্চিত না কেন আপনি কেন আপনার টাইমস্ট্যাম্প-উত্পন্ন স্ট্রিংয়ের সাথে এলোমেলো স্ট্রিং উপস্থাপন করছেন? এছাড়াও, আপনি এখনও আপনার RNGCryptoServiceProvider মীমাংসা করা প্রয়োজন
মন্টি

2

ব্যবহার না করে একটি সমাধান Random:

var chars = Enumerable.Repeat("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 8);

var randomStr = new string(chars.SelectMany(str => str)
                                .OrderBy(c => Guid.NewGuid())
                                .Take(8).ToArray());

2
নিউগুইড অভ্যন্তরীণভাবে এলোমেলোভাবে ব্যবহার করে। সুতরাং এটি এখনও এলোমেলোভাবে ব্যবহার করছে, এটি কেবল এটি লুকিয়ে রয়েছে।
ওয়েজ

2

এখানে উইনআরটি (উইন্ডোজ স্টোর অ্যাপ) এর জন্য এরিক জে'র সমাধানের অর্থ, যেমন ক্রিপ্টোগ্রাফিকভাবে সাউন্ডের একটি বৈকল্পিক:

public static string GenerateRandomString(int length)
{
    var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    var result = new StringBuilder(length);
    for (int i = 0; i < length; ++i)
    {
        result.Append(CryptographicBuffer.GenerateRandomNumber() % chars.Length);
    }
    return result.ToString();
}

যদি কর্মক্ষমতা গুরুত্বপূর্ণ (বিশেষত দৈর্ঘ্য বেশি থাকে):

public static string GenerateRandomString(int length)
{
    var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    var result = new System.Text.StringBuilder(length);
    var bytes = CryptographicBuffer.GenerateRandom((uint)length * 4).ToArray();
    for (int i = 0; i < bytes.Length; i += 4)
    {
        result.Append(BitConverter.ToUInt32(bytes, i) % chars.Length);
    }
    return result.ToString();
}

1
এই হয় না ক্রিপ্টোগ্রাফি শব্দ। মডুলাস অপারেশনের কারণে উলংয়ের পুরো প্রস্থ সমানভাবে 62 টি অক্ষরে ছড়িয়ে না দেওয়ার কারণে একটি ছোট পক্ষপাত রয়েছে।
মিথ্যা রায়ান

1

আমি জানি এটি সবচেয়ে ভাল উপায় নয়। তবে আপনি এটি চেষ্টা করতে পারেন।

string str = Path.GetRandomFileName(); //This method returns a random file name of 11 characters
str = str.Replace(".","");
Console.WriteLine("Random string: " + str);

2
কিভাবে এই এক লাইন? কনসোল.ওরাইটলাইন (Rand "এলোমেলো স্ট্রিং: {পথ.গেটর্যান্ডমফিলনাম ()। প্রতিস্থাপন ("। "," ");")); এক লাইন
PmanAce

1

আমি জানি না এটি ক্রিপ্টোগ্রাফিকভাবে কতটা শক্তিশালী, তবে এটি আরও বেশি জটিল (ইমো) দ্বারা জটিলতর সমাধানের চেয়ে আরও পঠনযোগ্য এবং সংক্ষিপ্ত এবং এটি System.Randomভিত্তিক সমাধানগুলির চেয়ে আরও "এলোমেলো" হওয়া উচিত ।

return alphabet
    .OrderBy(c => Guid.NewGuid())
    .Take(strLength)
    .Aggregate(
        new StringBuilder(),
        (builder, c) => builder.Append(c))
    .ToString();

আমি এই সংস্করণটি বা পরবর্তী সংস্করণটি "সুন্দর" মনে করি কিনা তা আমি সিদ্ধান্ত নিতে পারি না তবে তারা ঠিক একই ফলাফল দেয়:

return new string(alphabet
    .OrderBy(o => Guid.NewGuid())
    .Take(strLength)
    .ToArray());

মঞ্জুর, এটি গতির জন্য অনুকূলিত নয়, সুতরাং যদি প্রতি সেকেন্ডে কয়েক মিলিয়ন এলোমেলো স্ট্রিং উত্পন্ন করার মিশনটি সমালোচনা করে তবে অন্য একটি চেষ্টা করুন!

দ্রষ্টব্য: এই সমাধানটি বর্ণমালায় প্রতীকগুলির পুনরাবৃত্তির অনুমতি দেয় না এবং বর্ণমালা আউটপুট স্ট্রিংয়ের চেয়ে সমান বা বৃহত্তর আকারের হওয়া আবশ্যক, কিছু পরিস্থিতিতে এই পদ্ধতিকে কম আকাঙ্ক্ষিত করে তোলে, এটি সবই আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে।


0

যদি আপনার মানগুলি সম্পূর্ণরূপে এলোমেলো না হয় তবে বাস্তবে কোনও কিছুর উপর নির্ভর করতে পারে - আপনি সেই 'স্মোথিং'-এর একটি এমডি 5 বা শ 1 হ্যাশ গণনা করতে পারেন এবং তারপরে আপনি যে দৈর্ঘ্যটি চান তা কেটে ফেলতে পারেন।

এছাড়াও আপনি একটি নির্দেশিকা তৈরি এবং ছাঁটাই করতে পারেন।


0
public static class StringHelper
{
    private static readonly Random random = new Random();

    private const int randomSymbolsDefaultCount = 8;
    private const string availableChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    private static int randomSymbolsIndex = 0;

    public static string GetRandomSymbols()
    {
        return GetRandomSymbols(randomSymbolsDefaultCount);
    }

    public static string GetRandomSymbols(int count)
    {
        var index = randomSymbolsIndex;
        var result = new string(
            Enumerable.Repeat(availableChars, count)
                      .Select(s => {
                          index += random.Next(s.Length);
                          if (index >= s.Length)
                              index -= s.Length;
                          return s[index];
                      })
                      .ToArray());
        randomSymbolsIndex = index;
        return result;
    }
}

2
1) স্থিতিশীল পদ্ধতি থ্রেড নিরাপদ হওয়া উচিত। 2) random.Nextসরাসরি ফলাফল ব্যবহার না করে সূচক বাড়ানোর কী লাভ ? কোড জটিল করে তোলে এবং দরকারী কিছু অর্জন করে না।
কোডসইনচাওস

0

বর্ণমালা এবং সংখ্যাগুলি সংজ্ঞায়িত না করে এলোমেলো আলফা-সংখ্যার স্ট্রিং তৈরি করতে একটি পদ্ধতি রয়েছে (আমি এটি পাসওয়ার্ড এবং পরীক্ষার ডেটা উত্পন্ন করতে ব্যবহার করি),

ক্লিনআপবেস 64 স্ট্রিংয়ের প্রয়োজনীয় অংশগুলি সরিয়ে ফেলবে এবং এলোমেলোভাবে র্যান্ডম আলফা-সংখ্যাসূচক অক্ষর যুক্ত করতে থাকবে।

        public static string GenerateRandomString(int length)
        {
            var numArray = new byte[length];
            new RNGCryptoServiceProvider().GetBytes(numArray);
            return CleanUpBase64String(Convert.ToBase64String(numArray), length);
        }

        private static string CleanUpBase64String(string input, int maxLength)
        {
            input = input.Replace("-", "");
            input = input.Replace("=", "");
            input = input.Replace("/", "");
            input = input.Replace("+", "");
            input = input.Replace(" ", "");
            while (input.Length < maxLength)
                input = input + GenerateRandomString(maxLength);
            return input.Length <= maxLength ?
                input.ToUpper() : //In my case I want capital letters
                input.ToUpper().Substring(0, maxLength);
        }

আপনি ঘোষণা করেছেন GenerateRandomStringএবং এর GetRandomStringমধ্যে থেকে কল করেছেন SanitiseBase64String। এছাড়াও আপনি ঘোষণা SanitiseBase64String এবং কল CleanUpBase64Stringকরেছেন GenerateRandomString
ওয়াই হা লি


0

100% নিশ্চিত নয়, যেহেতু আমি এখানে সমস্ত বিকল্প পরীক্ষা করে দেখিনি, তবে আমি যা পরীক্ষা করেছি, এটি দ্রুততম। এটি স্টপওয়াচের সাথে সময়সীমা নির্ধারণ করে এবং এটি 9-10 টিক দেখায় তাই যদি গতির সুরক্ষার চেয়ে আরও গুরুত্বপূর্ণ হয় তবে এটি চেষ্টা করুন:

 private static Random random = new Random(); 
 public static string Random(int length)
     {   
          var stringChars = new char[length];

          for (int i = 0; i < length; i++)
              {
                  stringChars[i] = (char)random.Next(0x30, 0x7a);                  
                  return new string(stringChars);
              }
     }

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