অনন্য এলোমেলো স্ট্রিং জেনারেশন


98

আমি জেনারেট করতে বেশী মত র্যান্ডম অনন্য স্ট্রিং দুটিই MSDN গ্রন্থাগার। (দ্বারা তৈরি করা হচ্ছে চাই ত্রুটি অবজেক্ট ), উদাহরণস্বরূপ। 'T9zk6eay' এর মতো একটি স্ট্রিং উত্পন্ন করা উচিত।


4
আরও চেষ্টা করুন এখানেstring randoms = Guid.NewGuid().ToString().Replace("-", string.Empty).Replace("+", string.Empty).Substring(0, 4); পাওয়া যাবে
shaijut

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

উত্তর:


86

গাইড ব্যবহার করা বেশ ভাল উপায় হতে পারে তবে আপনার উদাহরণের মতো দেখতে কিছু পেতে আপনি সম্ভবত এটি একটি বেস 64 স্ট্রিংয়ে রূপান্তর করতে চান:

    Guid g = Guid.NewGuid();
    string GuidString = Convert.ToBase64String(g.ToByteArray());
    GuidString = GuidString.Replace("=","");
    GuidString = GuidString.Replace("+","");

আপনার উদাহরণের সাথে সামান্য কাছাকাছি পেতে আমি "=" এবং "+" থেকে মুক্তি পেয়েছি, অন্যথায় আপনি আপনার স্ট্রিংয়ের শেষে "==" এবং মাঝখানে একটি "+" পাবেন। এখানে আউটপুট স্ট্রিংয়ের একটি উদাহরণ রয়েছে:

"OZVV5TpP4U6wJthaCORZEQ"


15
আপনার প্রতিস্থাপন / খুব বিবেচনা করা উচিত।
জেসন কেলে

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

কি Convert.ToBase64Stringসম্পর্কে পরিষ্কার এবং সংক্ষিপ্ত ব্যাখ্যার জন্য , এখানে একবার দেখুন
jwaliszko

4
গাইডকে বেস 64 এ রূপান্তর করতে এবং + এবং = ক্রমবর্ধমান সংঘর্ষের সম্ভাবনা প্রতিস্থাপন করতে পারে?
মিলন আগরওয়াল

7
@ সিমোনজেসিং আমি আপনাকে একটি বিয়ারে আমন্ত্রণ জানাবো যদি আপনি new Guid()"হ্যাকিং" ব্যবহার না করে (ঘড়ির বা অভ্যন্তরীণ উইন্ডোজ ডেটা স্ট্রাকচারের সাথে হস্তক্ষেপ করা) কোনও সংঘর্ষে পড়ে এমন একটি অ্যাপ্লিকেশন লিখতে পারেন তবে আপনার পছন্দ মতো অনেকগুলি কর, থ্রেড, সিঙ্ক্রোনাইজেশন আদিম ইত্যাদি ব্যবহার করতে নির্দ্বিধায় মনে করুন।
Lucero

175

আপডেট 2016/1/23

যদি আপনি এই উত্তরটি দরকারী মনে করেন তবে আপনি প্রকাশিত একটি সাধারণ (~ 500 এসএলওসি) পাসওয়ার্ড জেনারেশন লাইব্রেরিতে আগ্রহী হতে পারেন :

Install-Package MlkPwgen

তারপরে আপনি নীচের উত্তরের মতো এলোমেলো স্ট্রিং তৈরি করতে পারেন:

var str = PasswordGenerator.Generate(length: 10, allowed: Sets.Alphanumerics);

লাইব্রেরির একটি সুবিধা হ'ল কোডটি আরও ভালভাবে তৈরি করা হয়েছে যাতে আপনি স্ট্রিং তৈরির চেয়ে বেশি সুরক্ষিত এলোমেলো ব্যবহার করতে পারেন । পরীক্ষা করে দেখুন প্রকল্পের সাইটে আরো বিস্তারিত জানার জন্য।

আসল উত্তর

যেহেতু কেউ এখনও সুরক্ষিত কোড সরবরাহ করেনি, তাই কেউ যদি এটির কাজে লাগে সে ক্ষেত্রে আমি নিম্নলিখিতটি পোস্ট করি।

string RandomString(int length, string allowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") {
    if (length < 0) throw new ArgumentOutOfRangeException("length", "length cannot be less than zero.");
    if (string.IsNullOrEmpty(allowedChars)) throw new ArgumentException("allowedChars may not be empty.");

    const int byteSize = 0x100;
    var allowedCharSet = new HashSet<char>(allowedChars).ToArray();
    if (byteSize < allowedCharSet.Length) throw new ArgumentException(String.Format("allowedChars may contain no more than {0} characters.", byteSize));

    // Guid.NewGuid and System.Random are not particularly random. By using a
    // cryptographically-secure random number generator, the caller is always
    // protected, regardless of use.
    using (var rng = System.Security.Cryptography.RandomNumberGenerator.Create()) {
        var result = new StringBuilder();
        var buf = new byte[128];
        while (result.Length < length) {
            rng.GetBytes(buf);
            for (var i = 0; i < buf.Length && result.Length < length; ++i) {
                // Divide the byte into allowedCharSet-sized groups. If the
                // random value falls into the last group and the last group is
                // too small to choose from the entire allowedCharSet, ignore
                // the value in order to avoid biasing the result.
                var outOfRangeStart = byteSize - (byteSize % allowedCharSet.Length);
                if (outOfRangeStart <= buf[i]) continue;
                result.Append(allowedCharSet[buf[i] % allowedCharSet.Length]);
            }
        }
        return result.ToString();
    }
}

কীভাবে কোড .NET কোরটিতে কাজ করা যায় তা নির্দেশ করার জন্য আহমদকে ধন্যবাদ জানাই।


@ কেলটেক্স সমাধানটি মেহের জন্য সঠিকভাবে কাজ করছিল না (এটি কয়েকটি ব্যবহারের পরে একই স্ট্রিংটি ফিরছিল)। এই সমাধানটি নিখুঁতভাবে কাজ করে :)
JoanComasFdz

4
@ লিগ্রিসম, বাইসিং একটি গুরুত্বপূর্ণ দিক। উদাহরণস্বরূপ বলতে দিন যে আপনার বর্ণমালাতে 255 টি অক্ষর রয়েছে এবং আপনি 0-255 এর মধ্যে একটি এলোমেলো মান পান। একটি রিং বাফারে মান 0 এবং 255 উভয়ই একই চরিত্রের সাথে মিলে যায় যা ফলকে বর্ণমালায় প্রথম অক্ষরের অনুকূলে ফেলে দেয়, এটি কম এলোমেলো হবে। যদি এই বিষয়গুলি অবশ্যই প্রয়োগের উপর নির্ভর করে।
ওসকার সিজবার্গ

4
কে লক্ষ্য করে এর .netcore: প্রতিস্থাপন var rng = new RNGCryptoServiceProvider()সঙ্গেvar rng = RandomNumberGenerator.Create()
AMD

4
আপনি কেন 'var outOfRangeStart = byteSize - (বাইট সাইজ% অনুমোদিতচ্যারসেট.লাইনগথ) গণনা করেন;' প্রতিটি পুনরাবৃত্তি জন্য? আপনি এটি ব্যবহার করার আগে গণনা করতে পারেন।
mtkachenko

4
@ বার্টকালিক্স্টো ফিক্সড ধন্যবাদ!
মাইকেল ক্রোপাট

38

আমি সাবধান করব যে জিইউইডিগুলি এলোমেলো সংখ্যা নয় । আপনি একেবারে এলোমেলো হওয়ার প্রত্যাশা করে এমন কিছু উত্পন্ন করার জন্য সেগুলি ভিত্তি হিসাবে ব্যবহার করা উচিত নয় (দেখুন http://en.wikedia.org/wiki/Globally_Unique_Identifier ):

উইনাপি জিইউইডি জেনারেটরের ক্রিপটানালাইসিস দেখায় যে, ভি 4 জিইউইডিগুলির ক্রমটি সিউডো-এলোমেলো, প্রাথমিক অবস্থার পরে কোনওটি ইউইউইডক্রিয়েট দ্বারা ফিরে আসা 250,000 জিইউইডিগুলির পূর্বাভাস দিতে পারে। এই কারণেই জিআইইডিগুলি ক্রিপ্টোগ্রাফিতে ব্যবহার করা উচিত নয়, যেমন, এলোমেলো কী হিসাবে।

পরিবর্তে, কেবল সি # র‌্যান্ডম পদ্ধতিটি ব্যবহার করুন। এর মতো কিছু ( কোডটি এখানে পাওয়া গেছে ):

private string RandomString(int size)
{
  StringBuilder builder = new StringBuilder();
  Random random = new Random();
  char ch ;
  for(int i=0; i<size; i++)
  {
    ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))) ;
    builder.Append(ch);
  }
  return builder.ToString();
}

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

সম্পাদনা করুন । মাইক্রোসফ্ট বলেছে যে র্যান্ডম তেমন দুর্দান্ত নয় ( http://msdn.microsoft.com/en-us/library/system.random(VS.71).aspx ):

একটি এলোমেলো পাসওয়ার্ড তৈরির জন্য উপযুক্ত একটি ক্রিপ্টোগ্রাফিক সুরক্ষিত র্যান্ডম নম্বর উত্পন্ন করার জন্য, উদাহরণস্বরূপ, সিস্টেম.সিকিউরিটি.ক্রিপোগ্রাফি.র্যান্ডম নাম্বার জেনারেটর যেমন সিস্টেম.সিকিউরিটি.ক্রিপোগ্রাফি.আরএনজিক্রিপ্টো সার্ভিস প্রোভাইডার ব্যবহার করুন।


4
সি # র‌্যান্ডম ক্লাসটি কোনওভাবেই ‘এলোমেলো’ নয় এবং কোনও ক্রিপ্টো কোডের জন্য অনুপযুক্ত নয়, কারণ এটি একটি নির্দিষ্ট বীজ সংখ্যা থেকে শুরু করে একটি ক্লাসিক র্যান্ডম জেনারেটর। একই বীজও ফিরে আসা সংখ্যার একই ক্রমটি ফিরিয়ে দেবে; জিইউইড পদ্ধতির ইতিমধ্যে এখানে আরও ভাল ("এলোমেলো" নয় "অনন্য")।
লুসরো

4
@ লুসেরো: আপনি ঠিক বলেছেন। মাইক্রোসফ্ট সুপারিশ করে, "একটি র্যান্ডম পাসওয়ার্ড তৈরির জন্য উপযুক্ত একটি ক্রিপ্টোগ্রাফিক সুরক্ষিত র্যান্ডম নম্বর উত্পন্ন করার জন্য, উদাহরণস্বরূপ, সিস্টেম.সিকিউরিটি.ক্রিপোগ্রাফি.র্যান্ডম নাম্বার জেনারেটর যেমন সিস্টেম.সিকিউরিটি.ক্রিপোগ্রাফি.আরএনজিক্রিপ্টোসোসভারপ্রোভিডার।
কেলটেক্স

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

4
"প্রাথমিক অবস্থার পরে পরবর্তী 250,000 জিইউআইডি পর্যন্ত ভবিষ্যদ্বাণী করা যেতে পারে" এই বিবৃতিটি কোনও পিআরএনজির জন্য সহজাত সত্য বিবৃতি বলে মনে হচ্ছে ... আমি নিশ্চিত যে এটিও সুরক্ষিত নয়, তবে আমি নিশ্চিত না যে উত্পাদনের অনেক মূল্য আছে সত্যিকারের এলোমেলো ইউআরএল, যদি এটি ওপি যা করে চলেছে। ;)
ওজরাক

4
(যাইহোক +1 - PRNG শিক্ষা গুরুত্বপূর্ণ))
ওজ্রাক

13

আমি @ মিশেল ক্রপ্যাটস সমাধানটি সরল করে দিয়ে একটি লিনকুই-এস্কো সংস্করণ তৈরি করেছি।

string RandomString(int length, string alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
{       
    var outOfRange = byte.MaxValue + 1 - (byte.MaxValue + 1) % alphabet.Length;

    return string.Concat(
        Enumerable
            .Repeat(0, int.MaxValue)
            .Select(e => RandomByte())
            .Where(randomByte => randomByte < outOfRange)
            .Take(length)
            .Select(randomByte => alphabet[randomByte % alphabet.Length])
    );
}

byte RandomByte()
{
    using (var randomizationProvider = new RNGCryptoServiceProvider())
    {
        var randomBytes = new byte[1];
        randomizationProvider.GetBytes(randomBytes);
        return randomBytes.Single();
    }   
}

12

আমি মনে করি না যে এগুলি সত্যই এলোমেলো, তবে আমার ধারণা এগুলি কিছু হ্যাশ।

যখনই আমার কিছু এলোমেলো শনাক্তকারী প্রয়োজন, আমি সাধারণত একটি জিইউডি ব্যবহার করি এবং এটিকে তার "নগ্ন" উপস্থাপনায় রূপান্তর করি:

Guid.NewGuid().ToString("n");

@ কেলটেক্স যেমন উল্লেখ করেছে: উইনাপি জিইউইডি জেনারেটরের ক্রিপ্টানালাইসিস দেখায় যে, ভি 4 জিইউইডিগুলির ক্রমটি সিউডো-এলোমেলো, প্রাথমিক অবস্থার পরে কেউ ইউইউডক্রিয়েট দ্বারা ফিরে আসা 250 250 জিইউইডিগুলি পূর্বাভাস দিতে পারে।
জোয়ানকোমাসএফডিজেড

4

গাইড এবং টাইম এর মধ্যে সংমিশ্রণ চেষ্টা করুন icks

 var randomNumber = Convert.ToBase64String(Guid.NewGuid().ToByteArray()) + DateTime.Now.Ticks;
     randomNumber = System.Text.RegularExpressions.Regex.Replace(randomNumber, "[^0-9a-zA-Z]+", "");

3

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

var bytes = new byte[40]; // byte size
using (var crypto = new RNGCryptoServiceProvider())
  crypto.GetBytes(bytes);

var base64 = Convert.ToBase64String(bytes);
Console.WriteLine(base64);

আপনি যদি কোনও গাইডের সাথে অর্থ প্রদান করতে চান:

var result = Guid.NewGuid().ToString("N") + base64;
Console.WriteLine(result);

একটি ক্লিনার আলফানামুরিক স্ট্রিং:

result = Regex.Replace(result,"[^A-Za-z0-9]","");
Console.WriteLine(result);

1

মাইক্রো ক্রপ্যাটস সলিউশনটি ভিবি.নেটে

Private Function RandomString(ByVal length As Integer, Optional ByVal allowedChars As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") As String
    If length < 0 Then Throw New ArgumentOutOfRangeException("length", "length cannot be less than zero.")
    If String.IsNullOrEmpty(allowedChars) Then Throw New ArgumentException("allowedChars may not be empty.")


    Dim byteSize As Integer = 256
    Dim hash As HashSet(Of Char) = New HashSet(Of Char)(allowedChars)
    'Dim hash As HashSet(Of String) = New HashSet(Of String)(allowedChars)
    Dim allowedCharSet() = hash.ToArray

    If byteSize < allowedCharSet.Length Then Throw New ArgumentException(String.Format("allowedChars may contain no more than {0} characters.", byteSize))


    ' Guid.NewGuid and System.Random are not particularly random. By using a
    ' cryptographically-secure random number generator, the caller is always
    ' protected, regardless of use.
    Dim rng = New System.Security.Cryptography.RNGCryptoServiceProvider()
    Dim result = New System.Text.StringBuilder()
    Dim buf = New Byte(128) {}
    While result.Length < length
        rng.GetBytes(buf)
        Dim i
        For i = 0 To buf.Length - 1 Step +1
            If result.Length >= length Then Exit For
            ' Divide the byte into allowedCharSet-sized groups. If the
            ' random value falls into the last group and the last group is
            ' too small to choose from the entire allowedCharSet, ignore
            ' the value in order to avoid biasing the result.
            Dim outOfRangeStart = byteSize - (byteSize Mod allowedCharSet.Length)
            If outOfRangeStart <= buf(i) Then
                Continue For
            End If
            result.Append(allowedCharSet(buf(i) Mod allowedCharSet.Length))
        Next
    End While
    Return result.ToString()
End Function

1

এটি আমার জন্য নিখুঁত কাজ করে

    private string GeneratePasswordResetToken()
    {
        string token = Guid.NewGuid().ToString();
        var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(token);
        return Convert.ToBase64String(plainTextBytes);
    }

0

এটি বিভিন্ন ভাষার জন্য বলা হয়েছে। এখানে পাসওয়ার্ড সম্পর্কে একটি প্রশ্ন যা এখানে প্রযোজ্যও উচিত।

আপনি যদি ইউআরএল সংক্ষিপ্তকরণের জন্য স্ট্রিংগুলি ব্যবহার করতে চান তবে আপনার তৈরি করা একটি আইডি ইতিমধ্যে ব্যবহৃত হয়েছে কিনা তা দেখতে আপনার অভিধান <>> বা ডাটাবেস চেকেরও প্রয়োজন।


0

আপনি যদি ছোট হাতের অক্ষর এবং বড় হাতের অক্ষরের ([a-zA-Z0-9]) সহ একটি আলফানিউমেরিক স্ট্রিং চান তবে আপনি দ্রুত এবং সাধারণ সমাধানের জন্য Convers.ToBase64String () ব্যবহার করতে পারেন।

স্বতন্ত্রতা হিসাবে, একটি সংঘর্ষ কীভাবে দেওয়া হচ্ছে তা গণনা করতে জন্মদিনের সমস্যাটি পরীক্ষা করে দেখুন (ক) উত্পন্ন স্ট্রিংগুলির দৈর্ঘ্য এবং (খ) উত্পন্ন স্ট্রিংয়ের সংখ্যা।

Random random = new Random();

int outputLength = 10;
int byteLength = (int)Math.Ceiling(3f / 4f * outputLength); // Base64 uses 4 characters for every 3 bytes of data; so in random bytes we need only 3/4 of the desired length
byte[] randomBytes = new byte[byteLength];
string output;
do
{
    random.NextBytes(randomBytes); // Fill bytes with random data
    output = Convert.ToBase64String(randomBytes); // Convert to base64
    output = output.Substring(0, outputLength); // Truncate any superfluous characters and/or padding
} while (output.Contains('/') || output.Contains('+')); // Repeat if we contain non-alphanumeric characters (~25% chance if length=10; ~50% chance if length=20; ~35% chance if length=32)

-1
  • নিশ্চিত নয় যে মাইক্রোসফ্টের লিঙ্ক এলোমেলোভাবে উত্পন্ন হয়েছে
  • নতুন গাইড () দেখুন। টুস্ট্রিং ()

4
আপনার অর্থ গাইড.নিউইউইজিড ()। টুস্ট্রিং () - গাইডের কোন পাবলিক কনস্ট্রাক্টর নেই
সিজেকে

4
আপনি সম্ভবত সঠিক, ডাব্লু / ও ভেরিফাই টাইপ করছিলেন। আমি নিশ্চিত যে মূল পোস্টারটির পয়েন্ট রয়েছে।
ফ্যাবিয়ান ভিলার্স

-1

জিইউইডি হ্যাশ কোড ব্যবহার করে অনন্য কী পান

public static string GetUniqueKey(int length)
{
    string guidResult = string.Empty;

    while (guidResult.Length < length)
    {
        // Get the GUID.
        guidResult += Guid.NewGuid().ToString().GetHashCode().ToString("x");
    }

    // Make sure length is valid.
    if (length <= 0 || length > guidResult.Length)
        throw new ArgumentException("Length must be between 1 and " + guidResult.Length);

    // Return the first length bytes.
    return guidResult.Substring(0, length);
}

এটি নিখুঁতভাবে কাজ করে তবে এলোমেলো শব্দগুলিতে স্বতন্ত্র অক্ষর নেই। চরিত্রগুলি পুনরাবৃত্তি করছে, যেমন 114e3 (দুটি 1 এর), ইএইএ (তিনটি এবং দুটি ই), 60207 (দুই 0 এর) এবং আরও অনেক কিছু। বর্ণানুক্রমিক সংমিশ্রণের সাথে অক্ষরের পুনরাবৃত্তি না করে একটি এলোমেলো স্ট্রিং কীভাবে তৈরি করা যায়?
বিজয়

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