අහඹු අක්ෂරාංක නූල් ජනනය කරන්නේ කෙසේද?


1009

සී # හි අහඹු 8 අක්ෂර අක්ෂර සංඛ්‍යාංකයක් ජනනය කරන්නේ කෙසේද?


2
අක්ෂර කට්ටලයට ඔබට යම් සීමාවන් තිබේ නම් කුමන සීමාවන් තිබේද? ඉංග්‍රීසි භාෂා අක්ෂර සහ 0-9? මිශ්‍ර නඩුව?
එරික් ජේ


9
Randomමුරපද ජනනය කිරීම සඳහා ඔබ පන්තිය මත පදනම් වූ කිසිදු ක්‍රමයක් භාවිතා නොකළ යුතු බව සලකන්න . බීජ වැපිරීම Randomඉතා අඩු එන්ට්‍රොපිය ඇත, එබැවින් එය සැබවින්ම ආරක්ෂිත නොවේ. මුරපද සඳහා ගුප්ත ලේඛනගත PRNG භාවිතා කරන්න.
කෝඩ්ස්ඉන්චෝස්

2
මෙම ප්‍රශ්නයට භාෂා ප්‍රාදේශීයකරණය ඇතුළත් කිරීම සතුටක්. විශේෂයෙන් ඔබේ ගුයි චීන හෝ බල්ගේරියානු භාෂාව සපුරාලීමට අවශ්‍ය නම්!
පීටර් ජම්ස්මන්සන්

15
මෙම බොහෝ උඩු යටිකුරු කිරීම් සහ ගුණාත්මක පිළිතුරු බොහොමයක් සංවෘත ලෙස සලකුණු කිරීමට සුදුසු නොවේ. එය නැවත විවෘත කරන ලෙස මම ඡන්දය දෙමි.
ජෝන් කෝල්මන්

Answers:


1733

ලින්ක් යනු නව කළු බව මට අසන්නට ලැබුණි, එබැවින් ලින්ක් භාවිතා කරමින් මගේ උත්සාහය මෙන්න:

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පන්ති කරන්නේ මේ කිසිවක් ආරක්ෂක හා සම්බන්ධ නුසුදුසු එවැනි මුරපද හෝ ඇඟවුම් කරන නිර්මාණය ලෙස, භාවිතා කරන්න. RNGCryptoServiceProviderඔබ ශක්තිමත් අහඹු අංක ජනනය අවශ්ය නම් පන්ති.)


25
Lex ඇලෙක්ස්: මම ඉක්මන් පරීක්ෂණ කිහිපයක් පවත්වා ඇති අතර දිගු නූල් ජනනය කිරීමේදී එය බොහෝ දුරට රේඛීයව පරිමාණය කර ඇති බව පෙනේ (ඇත්ත වශයෙන්ම ප්‍රමාණවත් මතකයක් පවතින තාක් කල්). එසේ පැවසීමෙන් පසු ඩෑන් රිගිගේ පිළිතුර සෑම පරීක්ෂණයකදීම මෙන් දෙගුණයකටත් වඩා වේගවත් විය.
ලූක්

6
හොඳින්. ඔබේ නිර්ණායක වන්නේ එය ලින්ක් භාවිතා කරන බවත් එයට පිළිකුල් සහගත කේත ආඛ්‍යානයක් ඇති බවත් නම් එය අනිවාර්යයෙන්ම මී මැසි දණහිස් වේ. කේත ආඛ්‍යානය සහ ක්‍රියාත්මක කිරීමේ සත්‍ය මාර්ගය යන දෙකම තරමක් අකාර්යක්ෂම හා වක්‍ර ය. මාව වැරදියට තේරුම් ගන්න එපා, මම විශාල කේත හිපස්ටර් කෙනෙක් (මම පයිතන්ට කැමතියි), නමුත් මෙය රළු ගෝල්ඩ්බර්ග් යන්ත්‍රයකි.
eremzeit

6
මෙය තාක්ෂණික වශයෙන් ප්‍රශ්නයට පිළිතුරු සපයන අතර, එහි ප්‍රතිදානය ඉතා නොමඟ යවන සුළුය. අහඹු අක්ෂර ශබ්ද 8 ජනනය ඇති විය හැකි වැනි ඉතා මෙම හොඳම දී බිලියන 2 විවිධ ප්රතිඵල ඇති ෙහයින්ද, බොහෝ ප්රතිඵල. ප්රායෝගිකව ඊටත් වඩා අඩුය. ආරක්ෂාව සම්බන්ධ කිසිවක් සඳහා මෙය භාවිතා නොකිරීමට ඔබ විශාල FAT අනතුරු ඇඟවීමක් එක් කළ යුතුය.
කෝඩ්ස්ඉන්චෝස්

41
axaisoft: කුඩා අකුරු පා er කයාට අභ්‍යාසයක් ලෙස ඉතිරි වේ.
dtb

16
පහත දැක්වෙන රේඛාව ලබා දී ඇති මතකයට වඩා මතකය (ඒ අනුව කාලය) කාර්යක්ෂම වේreturn new string(Enumerable.Range(1, length).Select(_ => chars[random.Next(chars.Length)]).ToArray());
ටයිසන් විලියම්ස්

387
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පන්ති කරන්නේ මේ කිසිවක් ආරක්ෂක හා සම්බන්ධ නුසුදුසු එවැනි මුරපද හෝ ඇඟවුම් කරන නිර්මාණය ලෙස, භාවිතා කරන්න. RNGCryptoServiceProviderඔබ ශක්තිමත් අහඹු අංක ජනනය අවශ්ය නම් පන්ති.)


4
Lex ඇලෙක්ස්: මෙය නිරපේක්ෂ වේගවත්ම පිළිතුර නොවේ, නමුත් එය වේගවත්ම “සැබෑ” පිළිතුරයි (එනම්, භාවිතා කරන අක්ෂර සහ නූල් වල දිග පාලනය කිරීමට ඉඩ දෙන අයගේ).
ලූක් එච්

2
Lex ඇලෙක්ස්: ඇඩම් පෝරාඩ්ගේ GetRandomFileNameවිසඳුම ඉක්මන් වන නමුත් භාවිතා කරන අක්ෂර පාලනය කිරීමට ඉඩ නොදෙන අතර උපරිම දිග අක්ෂර 11 කි. ඩග්ලස්ගේ Guidවිසඳුම අකුණු වේගයෙන් සිදුවන නමුත් අක්ෂර A-F0-9 ට සීමා කර ඇති අතර උපරිම දිග අක්ෂර 32 කි.
ලූක් එච්

1
D ඇඩම්: ඔව්, ඔබට බහුවිධ ඇමතුම්වල ප්‍රති result ල ලබා ගත හැකි GetRandomFileNameනමුත් (අ) ඔබේ කාර්යසාධන වාසිය ඔබට අහිමි වනු ඇත, සහ (ආ) ඔබේ කේතය වඩාත් සංකීර්ණ වනු ඇත.
ලූක්

2
axaisoft ඔබේ ලූපයෙන් පිටත අහඹු () වස්තුව පිළිබඳ උදාහරණය සාදන්න. ඔබ කෙටි කාල පරාසයක් තුළ සසම්භාවී () අවස්ථා බොහොමයක් නිර්මාණය කරන්නේ නම් .නෙක්ස්ට් () වෙත ඇමතුම සසම්භාවී () කාලය පදනම් කරගත් බීජයක් භාවිතා කරන ආකාරයටම නැවත ලබා දෙනු ඇත.
ඩෑන් රිගි

2
axaisoft මුරපද වැනි ආරක්ෂක විවේචනාත්මක කිසිවක් සඳහා මෙම පිළිතුර භාවිතා නොකරන්න. System.Randomආරක්ෂාවට සුදුසු නොවේ.
CodesInChaos

341

අදහස් මත පදනම්ව යාවත්කාලීන කරන ලදි. මුල් ක්‍රියාවට නැංවීම මඟින් කාලය 1.95% ක් සහ ඉතිරි අක්ෂර ~ 1.56% ක් ජනනය විය. යාවත්කාලීනය මඟින් සියලුම අක්ෂර ~ 1.61% උත්පාදනය කරයි.

FRAMEWORK SUPPORT - .NET Core 3 (සහ .NET Standard 2.1 හෝ ඊට වැඩි සහය දක්වන අනාගත වේදිකා) මඟින් අපේක්ෂිත පරාසයක් තුළ අහඹු සංඛ්‍යා සංඛ්‍යාවක් ජනනය කිරීම සඳහා ගුප්ත විද්‍යාත්මකව හොඳ ක්‍රමවේදයක් RandomNumberGenerator.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
මෙය මට නිවැරදි ප්‍රවේශය සේ පෙනේ - අහඹු මුරපද, ලවණ, එන්ට්‍රොපි සහ යනාදිය සසම්භාවී () භාවිතයෙන් උත්පාදනය නොකළ යුතු අතර එය වේගය සඳහා ප්‍රශස්තිකරණය කර සංඛ්‍යා ප්‍රජනනය කළ හැකි අනුක්‍රමයන් ජනනය කරයි; RNGCryptoServiceProvider.GetNonZeroBytes () ප්‍රතිනිෂ්පාදනය කළ නොහැකි සංඛ්‍යා වල වල් අනුක්‍රමයන් නිෂ්පාදනය කරයි.
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. ඔබ එහි ප්‍රති .ලය භාවිතා නොකරයි.
CodesInChaos

14
විනෝදජනක කාරණය: AZ az 0-9 අක්ෂර 62 කි. 256% 62! අහම්බයක්ද? මම හිතන්නේ නෑ! :)
qJake

204

විසඳුම 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);
    }
}

මෙම විසඳුමට GUID භාවිතා කිරීමට වඩා වැඩි පරාසයක් ඇත, මන්ද GUID හි ස්ථාවර බිටු කිහිපයක් ඇති අතර එය සැමවිටම සමාන වන අතර එබැවින් අහඹු නොවේ, උදාහරණයක් ලෙස හෙක්ස් හි 13 අක්ෂර සෑම විටම "4" වේ - අවම වශයෙන් 6 GUID අනුවාදයක.

මෙම විසඳුම මඟින් ඕනෑම දිගකින් යුත් නූලක් ජනනය කිරීමට ඔබට ඉඩ සලසයි.

විසඳුම 2 - එක් කේත පේළියක් - අක්ෂර 22 ක් දක්වා හොඳයි

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

විසඳුම 1 වන තාක් ඔබට නූල් උත්පාදනය කළ නොහැකි අතර GUID හි ස්ථාවර බිටු නිසා නූලට එකම පරාසයක් නොමැත, නමුත් බොහෝ අවස්ථාවන්හිදී මෙය කාර්යය ඉටු කරනු ඇත.

විසඳුම 3 - තරමක් අඩු කේතය

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

බොහෝ දුරට මෙය historical තිහාසික අරමුණු සඳහා මෙහි තබා ගැනීම. එය තරමක් අඩු කේතයක් භාවිතා කරයි, එය අඩු පරාසයක වියදම ලෙස පැමිණියද - එය පදනම් 64 වෙනුවට හෙක්ස් භාවිතා කරන නිසා අනෙක් විසඳුම් හා සසඳන විට එකම පරාසය නිරූපණය කිරීමට වැඩි අක්ෂර ප්‍රමාණයක් අවශ්‍ය වේ.

එයින් අදහස් වන්නේ ision ට්ටනයට වැඩි අවස්ථාවක් - අක්ෂර 8 ක පුනරාවර්තන 100,000 ක් සමඟ එය පරීක්ෂා කිරීමෙන් එක් අනුපිටපතක් ජනනය වන බවයි.


22
ඔබ ඇත්ත වශයෙන්ම අනුපිටපතක් ජනනය කළාද? පුදුමයට කරුණක් නම් 5,316,911,983,139,663,491,615,228,241,121,400,000 GUID සංයෝජන.
ඇලෙක්ස්

73
Lex ඇලෙක්ස්: ඔහු GUID අක්ෂර 8 කට කෙටි කරයි, එබැවින් isions ට්ටනවල සම්භාවිතාව GUID වලට වඩා වැඩිය.
dtb

23
නර්ඩ්ස් හැර වෙන කිසිවෙකුට මෙය අගය කළ නොහැක :) ඔව් ඔබ හරියටම හරි, වරහන් 8 සීමාව වෙනස් කරයි.
ඇලෙක්ස්

31
ToString ("n") මඟින් ඉරක් ඉවතට තබනු ඇත, ප්‍රතිස්ථාපනය () ඇමතුමක් අවශ්‍ය නොවේ. නමුත් එය සඳහන් කළ යුතුය, GUIDs 0-9 සහ AF පමණි. සංයෝජන ගණන "ප්‍රමාණවත් තරම් හොඳයි", නමුත් සැබෑ අක්ෂරාංක අහඹු නූලක් ඉඩ දෙන දෙයට කොතැනකවත් සමීප නොවේ . Ision ට්ටනය වීමේ සම්භාවිතාව 1: 4,294,967,296 - අහඹු 32-බිටු නිඛිලයකට සමාන වේ.
රිචඩ්ටලන්ට්

32
1) GUIDs නිර්මාණය කර ඇත්තේ අහඹු ලෙස නොව අද්විතීය ලෙසය. කවුළු වල වර්තමාන අනුවාදයන් ඇත්ත වශයෙන්ම අහඹු ලෙස V4 GUIDs ජනනය කරන නමුත් එය සහතික නොවේ. උදාහරණයක් ලෙස පැරණි කවුළු වල V1 GUID භාවිතා කරන ලද අතර එහිදී ඔබට අසමත් විය හැකිය. 2) හෙක්ස් අක්ෂර භාවිතා කිරීමෙන් අහඹු නූල් වල ගුණාත්මකභාවය සැලකිය යුතු ලෙස අඩු කරයි. බිටු 47 සිට 32 දක්වා. 3) ගැටුම් සම්භාවිතාව අවතක්සේරු කරන්නේ මිනිසුන් එය තනි යුගල සඳහා ලබා දෙන බැවිනි. ඔබ 100k 32 බිට් අගයන් ජනනය කරන්නේ නම්, ඔබට ඒවා අතර එක ision ට්ටනයක් තිබිය හැකිය. උපන්දින ගැටලුව බලන්න.
CodesInChaos

73

මෙන්න මම ඩොට් නෙට් පර්ල්ස් හි සෑම් ඇලන් උදාහරණයෙන් සොරකම් කළ උදාහරණයක්

ඔබට අවශ්‍ය වන්නේ අක්ෂර 8 ක් නම්, System.IO නාම අවකාශයේ Path.GetRandomFileName () භාවිතා කරන්න. සෑම් පවසන්නේ "Path.GetRandomFileName ක්‍රමය මෙහි භාවිතා කිරීම සමහර විට වඩා උසස් බවයි, මන්ද එය වඩා හොඳ අහඹු ලෙස RNGCryptoServiceProvider භාවිතා කරන බැවිනි. කෙසේ වෙතත් එය අහඹු අක්ෂර 11 කට සීමා වේ."

GetRandomFileName සෑම විටම 9 වන අක්ෂරයේ කාල පරිච්ඡේදයක් සහිත අක්ෂර 12 ක නූලක් ලබා දෙයි. එබැවින් ඔබට කාල සීමාව ඉවත් කිරීමට අවශ්‍ය වේ (එය අහඹු නොවන බැවින්) ඉන්පසු අක්ෂර 8 කින් ගන්න. ඇත්ත වශයෙන්ම, ඔබට පළමු අක්ෂර 8 ගත හැකි අතර කාල පරිච්ඡේදය ගැන කරදර නොවන්න.

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

PS: ස්තූතියි සෑම්


28
මෙය හොඳින් ක්‍රියාත්මක වේ. මම එය පුනරාවර්තන 100,000 ක් හරහා ධාවනය කළ අතර කිසි විටෙක අනුපිටපතක් නොතිබුණි. කෙසේ වෙතත්, මම කළේ (ඉංග්රීසි) ග්රාම්ය වචන කිහිපයක් සොයා ගන්න. ලැයිස්තුවේ පළමු අයගෙන් එක් අයෙකු එෆ් *** හැරෙන්නට මේ ගැන සිතුවේවත් නැත. ඔබ මෙය පරිශීලකයා දකින දෙයක් සඳහා භාවිතා කරන්නේ නම් හිස ඔසවන්න.
techturtle

3
අනතුරු ඇඟවීමට ස්තූතියි. හෝඩියේ සියලුම අකුරු භාවිතා කරන අහඹු වචන පරම්පරාවක් සමඟ අසභ්‍ය වචන සඳහා අවදානමක් ඇතැයි මම සිතමි.
ඇඩම් පෝරාඩ්

ලස්සන හා සරල නමුත් දිගු නූල් සඳහා හොඳ නැත ... මෙම හොඳ උපක්‍රමයට ඡන්දය දෙන්න
මහර් අබුත්‍රා

මෙම ක්‍රමය මඟින් ආපසු එවනු ලබන්නේ කුඩා අක්ෂර අක්ෂර සංඛ්‍යා පමණි.
jaybro

3
වරින් වර අසභ්‍ය වචන ඇත, නමුත් ඔබ මෙය දිගු කාලයක් පවත්වා ගෙන ගියහොත් අවසානයේ එය ෂේක්ස්පියර් ලියයි. (විශ්වයේ ජීවිත කාලය කිහිපයක් පමණි. :)
Slothario

38

මගේ කේතයේ ප්‍රධාන අරමුණු:

  1. නූල් බෙදා හැරීම බොහෝ දුරට ඒකාකාරී ය (සුළු අපගමනයන් ගැන සැලකිලිමත් නොවන්න, ඒවා කුඩා වන තාක් කල්)
  2. එය එක් එක් තර්ක කට්ටලය සඳහා නූල් බිලියන කිහිපයකට වඩා ප්‍රතිදානය කරයි. ඔබේ PRNG මගින් ජනනය කරනුයේ බිලියන 2 ක් (එන්ට්‍රොපි බිටු 31) විවිධ අගයන් පමණි නම් අක්ෂර 8 ක නූලක් (එන්ට්‍රොපි බිට් 47) උත්පාදනය කිරීම අර්ථ විරහිත ය.
  3. මුරපද හෝ වෙනත් ආරක්ෂක ටෝකන සඳහා මිනිසුන් මෙය භාවිතා කරනු ඇතැයි මම අපේක්ෂා කරන බැවින් එය ආරක්ෂිතයි.

පළමු දේපල ලබා ගත හැක්කේ හෝඩියේ ප්‍රමාණයෙන් බිට් 64 ක මොඩියුලයක් ලබා ගැනීමෙනි. කුඩා හෝඩිය සඳහා (ප්‍රශ්නයේ අක්ෂර 62 වැනි) මෙය නොසැලකිලිමත් නැඹුරුවකට තුඩු දෙයි. දෙවන හා තෙවන දේපල ලබා ගත හැක්කේ 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 Z සහ Math.Pow (2, Y) සමඟ මංසන්ධියක් නොමැත. එබැවින් විශාල සංඛ්‍යා සෑදීමෙන් පක්ෂග්‍රාහී බව අඩු වුවද එය එය තුරන් නොකරයි. මම මගේ පිළිතුර පහතින් යාවත්කාලීන කළෙමි, මගේ ප්‍රවේශය වූයේ අහඹු යෙදවුම් ඉවත දමා වෙනත් අගයක් ආදේශ කිරීමයි.
ටොඩ්

Od ටොඩ් එය පක්ෂග්‍රාහී බව තුරන් නොකරන බව මම දනිමි, නමුත් ප්‍රායෝගිකව අදාළ නොවන නැඹුරුවක් තුරන් කිරීමට වඩා මෙම විසඳුමේ සරල බව මම තෝරා ගතිමි.
කෝඩ්ස්ඉන්චෝස්

බොහෝ අවස්ථාවල එය ප්‍රායෝගිකව අදාළ නොවන බව මම එකඟ වෙමි. නමුත් දැන් මම මගේ යාවත්කාලීන කර ඇත්තේ සසම්භාවී තරම් වේගවත් වන අතර ඔබට වඩා ටිකක් ආරක්ෂිතයි. සැමට බෙදා ගැනීමට සියලු විවෘත මූලාශ්‍ර. ඔව්, මම මේ සඳහා වැඩි කාලයක් නාස්ති කළා ...
ටොඩ්

අප RNG සැපයුම්කරු භාවිතා කරන්නේ නම් න්‍යායේ පක්ෂග්‍රාහී බව වළක්වා ගැනීමට අපට ක්‍රමයක් තිබේද? මට විශ්වාස නෑ ... ටොඩ් අදහස් කරන්නේ ඔහු අතිරේක අහඹු අංකයක් ජනනය කරන ආකාරය නම් (අප පක්ෂග්‍රාහී කලාපයේ සිටින විට) එය වැරදි උපකල්පනයක් විය හැකිය. සාමාන්‍යයෙන් ජනනය කරන ලද සියලු අගයන් රේඛීයව බෙදා හැරීම RNG සතුව ඇත. නමුත් ජනනය කරන ලද බයිට් අතර දේශීය සහසම්බන්ධයක් අපට නොමැති බව එයින් අදහස් නොවේ. එබැවින් පක්ෂග්‍රාහී කලාපයට පමණක් අමතර බයිට් තවමත් අපට යම් පක්ෂග්‍රාහී බවක් ලබා දිය හැකි නමුත් විවිධ හේතු නිසා. බොහෝ දුරට මෙම නැඹුරුව ඉතා කුඩා වනු ඇත. නමුත් මේ අවස්ථාවේ දී සම්පුර්ණ ජනනය කරන ලද බයිට් වැඩි කිරීම වඩා සරල ක්‍රමයකි.
මැක්සිම්

1
A මැක්සිම් ඔබට නැඹුරුව මුළුමනින්ම තුරන් කිරීම සඳහා ප්‍රතික්ෂේප කිරීම භාවිතා කළ හැකිය (යටි උත්පාදක යන්ත්රය අහඹු ලෙස උපකල්පනය කරයි). හුවමාරුවේදී කේතය අත්තනෝමතික ලෙස දිගු විය හැකිය (on ාතීය වශයෙන් කුඩා සම්භාවිතාවක් සහිතව).
කෝඩ්ස්ඉන්චෝස්

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නිමැවුම් ප්‍රමාණය බොහෝ විට හෝඩියේ ප්‍රමාණය මත රඳා පවතින බැවින් භාවිතා කිරීම විශාල කැතකි.
CodesInChaos

OdesCodesInChaos මම ඔබව තේරුම් ගත්තාදැයි මට විශ්වාස නැත. ඔබ අදහස් කළේ 'a'.To('z')ප්‍රවේශය තුළද?
නව්ෆල්

1
1). chars.Select()ගන්න (n) `ක්‍රියාත්මක වන්නේ නම් පමණි chars.Count >= n. ඔබ සැබවින්ම භාවිතා නොකරන අනුක්‍රමයක් තෝරා ගැනීම ටිකක් නොදැනුවත්වම සිදු වේ, විශේෂයෙන් එම ව්‍යංග දිග සීමාව සමඟ. මම භාවිතා කිරීමට Enumerable.Rangeහෝ Enumerable.Repeat. 2) "අවසාන වර්‍ගය ආරම්භක වර්‍ගයට වඩා අඩු විය යුතුය" යන දෝෂ පණිවිඩය වැරදි මාර්ගයකි not.
CodesInChaos

@CodesInChaos නමුත් මගේ නඩුව chars.Countක්රමයකි > n. ඒ වගේම මම නොදැනුවත්වම කොටස ලබා ගන්නේ නැහැ. එමඟින් සියලු භාවිතයන් Takeනොදැනුවත්වම සිදු නොවේද? මම එය විශ්වාස කරන්නේ නැහැ. යතුරු ලියනය පෙන්වා දීමට ස්තූතියි.
නව්ෆල්

4
මෙම විශේෂාංග වේ theDailyWTF.com වූ CodeSOD ලිපිය ලෙස.

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 සඳහා, ජනනය කරයි:

  • Linq = chdgmevhcy වෙතින් [10]
  • සිට Loop = gtnoaryhxr [10]
  • Select = rsndbztyby වෙතින් [10]
  • GenerateRandomString = owyefjjakj වෙතින් [10]
  • SecureFastRandom වෙතින් = VzougLYHYP [10]
  • SecureFastRandom-NoCache = oVQXNGmO1S වෙතින් [10]

හා කාර්ය සාධනය අංක ඉතා කලාතුරකිනි, මඳක් වෙනස් විය නැඹුරු NonOptimizedඇත්තටම වේගවත් වන අතර, ඇතැම් විට ForLoopසහ GenerateRandomStringපෙරමුණ තුළ කවුද මාරු.

  • LinqIsTheNewBlack (10000x) = 96762 කිනිතුල්ලන් ඉවරයි (9.6762 ms)
  • ForLoop (10000x) = කිනිතුල්ලන් 28970 ක් (2.897 ms)
  • ForLoopNonOptimized (10000x) = කිනිතුල්ලන් 33336 ක් (3.3336 ms)
  • පුනරාවර්තනය කරන්න (10000x) = කිනිතුල්ලන් 78547 ක් (7.8547 ms)
  • GenerateRandomString (10000x) = කිනිතුල්ලන් 27416 ක් (2.7416 ms)
  • SecureFastRandom (10000x) = 13176 කිනිතුල්ලන් ඉවරයි (මීටර් 5) අඩුම [වෙනස් යන්ත්‍රය]
  • SecureFastRandom-NoCache (10000x) = කිනිතුල්ලන් 39541 ක් (මීටර් 17) අඩුම [විවිධ යන්ත්‍ර]

3
කුමන අනුපිටපත් නිර්මාණය කළේ දැයි දැන ගැනීම සිත්ගන්නාසුළු වනු ඇත.
රෙබෙකා

Unt ජුන්ටෝ - අනුපිටපත් වල ප්‍රති results ල මොනවාදැයි සොයා ගැනීමට, වැනි දෙයක් var many = 10000; Assert.AreEqual(many, new bool[many].Select(o => EachRandomizingMethod(10)).Distinct().Count());, ඔබ ප්‍රතිස්ථාපනය EachRandomizingMethodකරන්නේ කොතැනද ... එක් එක් ක්‍රමය
drzaus

19

කේතයේ එක් පේළියක් Membership.GeneratePassword() උපක්‍රමය කරයි :)

මෙන්න ඒ සඳහා නිරූපණයක් .


1
මයික්රොසොෆ්ට් වගේ .. තවත් කේතය ආදර්ශ පවතී සබැඳිය ගියා msdn.microsoft.com/en-us/library/ms152017 හෝ aspnet.4guysfromrolla.com/demos/GeneratePassword.aspx හෝ developer.xamarin.com/api/member/...
පූරන්

2 වන තර්කය MINIMUM නොවන ඇල්ෆා අක්ෂර වන බැවින් මම ඒ ගැන සිතුවෙමි නමුත් අක්ෂර සංඛ්‍යා නොවන අක්ෂර ඉවත් කළ නොහැක
ozzy432836

14

එරික් ජේ විසින් ලියන ලද කේතය තරමක් අලස ය (එය මීට වසර 6 කට පෙර සිට බව පැහැදිලිය ... ඔහු අද එම කේතය ලියන්නේ නැත), සහ සමහර ගැටලු පවා තිබේ.

ඉදිරිපත් කර ඇති සමහර විකල්ප මෙන් නොව, මෙය ගුප්ත විද්‍යාත්මකව ශක්තිමත් ය.

අසත්‍යය ... මුරපදයේ පක්ෂග්‍රාහී බවක් ඇත (විවරණයක ලියා ඇති පරිදි), bcdefghඅනෙක් ඒවාට වඩා මඳක් වැඩි සම්භාවිතාවක් ඇත ( aඑයට හේතුව GetNonZeroBytesඑය ශුන්‍ය අගයක් සහිත බයිට් උත්පාදනය නොකිරීම නිසා නොවේ, එබැවින් නැඹුරුව සඳහාa ) එය විසින් සමබර වේ, එම නිසා එය හොඳ නැහැ cryptographically ශබ්ද වේ.

මෙය සියලු ගැටලු නිවැරදි කළ යුතුය.

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;
    }
}

පිළිතුර: මැජික් නූල් BAD වේ. කිසිවෙකු නොමැති බව කිසිවෙකු දුටුවාද?Iඉහළින් මගේ නූලෙහි " ? මේ හේතුව නිසාම මැජික් නූල් භාවිතා නොකරන ලෙස මගේ මව මට ඉගැන්නුවා ...

nb 1: tdtb වැනි තවත් බොහෝ අය පැවසූ පරිදි, System.Randomඔබට ගුප්ත ලේඛන ආරක්ෂාව අවශ්‍ය නම් භාවිතා නොකරන්න ...

nb 2: මෙම පිළිතුර වඩාත්ම කාර්යක්ෂම හෝ කෙටිම නොවේ, නමුත් මට අවශ්‍ය වූයේ ප්‍රශ්නයෙන් පිළිතුර වෙන් කිරීමට අවකාශයයි. මගේ පිළිතුරේ පරමාර්ථය වන්නේ නව්‍ය පිළිතුරක් ලබා දීමට වඩා මැජික් නූල් වලට එරෙහිව අනතුරු ඇඟවීමයි.


"නැති" බව මා සැලකිලිමත් වන්නේ ඇයි I?
ක්‍රිස්ටීන්

1
අක්ෂරාංක (නඩුව නොසලකා හැරීම) වේ [A-Z0-9]. අහම්බෙන්, ඔබේ අහඹු නූල පමණක් [A-HJ-Z0-9]ප්‍රති cover ලය ආවරණය කරන්නේ නම්, සම්පූර්ණ අවසර ලත් පරාසය ආවරණය නොවේ, එය ගැටළු සහගත විය හැකිය.
වයි හ ලී

එය ගැටලු සහගත වන්නේ කෙසේද? එබැවින් එහි අඩංගු නොවේ I. අඩු චරිතයක් ඇති නිසාත් එය ඉරිතැලීම පහසු කරන නිසා ද? 36 ට වඩා පරාසයේ අක්ෂර 35 ක් අඩංගු රති able ් pass ා මුරපද පිළිබඳ සංඛ්‍යාලේඛන මොනවාද? මම සිතන්නේ මම එය අවදානමට ලක්කරනු ඇතැයි කියාය ... නැතහොත් චරිත පරාසය සනාථ කිරීම සඳහා සාක්‍ෂි ... මගේ කේතයේ ඇති අතිරේක කසළ සියල්ල ඇතුළත් කිරීමට වඩා. ඒත්, ඒ මම. මම කිව්වේ, බට් කුහරයක් නොවිය යුතුයි, මම කියන්නේ. සමහර විට මම සිතන්නේ ක්‍රමලේඛකයන්ට අමතර සංකීර්ණ වීම සඳහා අමතර සංකීර්ණ මාර්ගයට යාමේ ප්‍රවණතාවක් ඇති බවයි.
ක්‍රිස්ටීන්

1
එය භාවිත නඩුව මත රඳා පවතී. එය වැනි චරිත ඉවත් කිරීමට ඉතා පොදු දෙයක් Iහා Oඒවා අවුල් මිනිසුන් වළක්වා ගැනීමට අහඹු නූල් මේ ආකාරයේ සිට 1හා 0. මිනිසුන්ට කියවිය හැකි නූලක් තිබීම ගැන ඔබ තැකීමක් නොකරන්නේ නම්, හොඳයි, නමුත් එය යමෙකුට ටයිප් කිරීමට අවශ්‍ය විය හැකි දෙයක් නම්, එම චරිත ඉවත් කිරීම ඇත්තෙන්ම බුද්ධිමත් ය.
ක්‍රිස් ප්‍රට්

6
 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

ඩීටීබී විසඳුමේ තරමක් පිරිසිදු අනුවාදයකි.

    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

අනෙක් පිළිතුරු සමාලෝචනය කිරීමෙන් පසුව සහ කෝඩ්ඉන්චාඕස්ගේ අදහස් සලකා බැලීමෙන් පසුව, කෝඩ්ඉන්චාඕස් තවමත් පක්ෂග්‍රාහී (අඩු වුවද) පිළිතුර සමඟ, අවසාන අවසාන කැපුම් හා පේස්ට් විසඳුමක් අවශ්‍ය යැයි මම සිතුවෙමි . ඒ නිසා මගේ පිළිතුර යාවත්කාලීන කරන අතරතුර මම සියල්ල පිටතට යාමට තීරණය කළෙමි.

මෙම කේතයේ යාවත්කාලීන අනුවාදයක් සඳහා, කරුණාකර බිට්බකට් හි නව Hg ගබඩාවට පිවිසෙන්න: https://bitbucket.org/merarischroeder/secureswiftrandom . කේතය පිටපත් කර අලවන්නැයි මම නිර්දේශ කරමි: https://bitbucket.org/merarischroeder/secureswiftrandom/src/6c14b874f34a3f6576b0213379ecdf0ffc7496ea/Code/Alivate.SolidSwiftRandom/SolidSwift ? අමු බොත්තම පහසුවෙන් පිටපත් කර ඔබට නවතම අනුවාදය ඇති බවට වග බලා ගන්න, මෙම සබැඳිය යන්නේ කේතයේ නිශ්චිත අනුවාදයකට මිස නවතම ඒවාට නොවේ).

යාවත්කාලීන කළ සටහන්:

  1. වෙනත් පිළිතුරු වලට අදාළව - ප්‍රතිදානයේ දිග ඔබ දන්නේ නම්, ඔබට StringBuilder අවශ්‍ය නොවන අතර ToCharArray භාවිතා කරන විට, මෙය අරාව නිර්මාණය කර පුරවයි (ඔබට මුලින් හිස් අරාවක් සෑදීමට අවශ්‍ය නැත)
  2. වෙනත් පිළිතුරු වලට සම්බන්ධ වීම - කාර්ය සාධනය සඳහා වරකට එකක් ලබා ගැනීමට වඩා ඔබ NextBytes භාවිතා කළ යුතුය
  3. තාක්ෂණික වශයෙන් ඔබට වේගවත් ප්‍රවේශය සඳහා බයිට් අරාව ඇලවිය හැකිය .. සාමාන්‍යයෙන් එය බයිට් අරාවකට වඩා 6-8 වාරයකට වඩා වැඩි වාර ගණනක් යෙදීම වටී. (මෙහි සිදු කර නැත)
  4. හොඳම අහඹු බව සඳහා RNGCryptoServiceProvider භාවිතය
  5. අහඹු දත්ත 1MB බෆරයක හැඹිලිය භාවිතා කිරීම - මිණුම් සලකුණු කිරීම මඟින් හැඹිලි තනි බයිට් වලට ප්‍රවේශවීමේ වේගය x 1000x වේගවත් බව පෙන්නුම් කරයි - 1MB ට වඩා 9m හා එදිරිව 989ms නොබැඳි සඳහා.
  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 . නොපෙනෙන. සිදු කෙරෙමින් : 5ms (සමහර විට එය 13ms දක්වා යයි) අනුකරණ 10,000 කට අධික, තනි සාමාන්ය ප්රතිඵලයක්ම = සමඟ 1.5 තත්පර. . සටහන: සාමාන්‍යයෙන් 2 ක් අවශ්‍ය වේ, නමුත් ඉඳහිට හැඹිලි ප්‍රබෝධ 8 ක් දක්වා - පක්ෂග්‍රාහී කලාපය ඉක්මවා යන තනි බයිට් ගණන මත රඳා පවතී
  2. සසම්භාවී - පළමු තනි ධාවනය = ~ 0-1ms . නොපෙනෙන. සිදු කෙරෙමින් : 5ms අනුකරණ 10,000 කට අධික. තනි සාමාන්‍ය ක්‍රියාවලියක් සමඟ = .5 මයික්‍රෝ තත්පර. . එකම වේගය ගැන.

එසේම පරීක්ෂා කරන්න:

මෙම සබැඳි තවත් ප්‍රවේශයකි. මෙම නව කේත පදනමට බෆරින් එකතු කළ හැකි නමුත් වඩාත්ම වැදගත් වූයේ නැඹුරුව ඉවත් කිරීම සඳහා විවිධ ප්‍රවේශයන් ගවේෂණය කිරීම සහ වේගය සහ වාසි / අවාසි මිණුම් සලකුණු කිරීමයි.


පොකුරේ නිරාහාරව සිටින බවක් පෙනෙන්නට ඇති ඔබේ ක්‍රමයට සුළු කාර්ය සාධනය වැඩි දියුණු කිරීම් මට හමු විය - stackoverflow.com/a/17092645/1037948
drzaus

5
1) ඇයි ඒ සියලු මැජික් නියතයන්? ඔබ නිමැවුම් දිග තුන් වරක් නියම කළා. එය නියත හෝ පරාමිතියක් ලෙස අර්ථ දක්වන්න. charSet.Lengthඒ වෙනුවට ඔබට භාවිතා කළ හැකිය 62. 2) Randomඅගුලු දැමීමකින් තොරව ස්ථිතිකයක් යනු මෙම කේතය නූල් ආරක්ෂිත නොවන බවයි. 3) 0-255 mod 62 අඩු කිරීමෙන් හඳුනාගත හැකි නැඹුරුවක් හඳුන්වා දෙයි. 4) ඔබට වර්‍ග ToStringඅරාව මත භාවිතා කළ නොහැක , එය සැමවිටම නැවත පැමිණේ "System.Char[]". new String(rName)ඒ වෙනුවට ඔබ භාවිතා කළ යුතුය.
CodesInChaos

ස්තූතියි odesCodesInChaos, මම ඒ දේවල් ගැන කවදාවත් හිතුවේ නැහැ. තවමත් සසම්භාවී පන්තිය පමණක් භාවිතා කරයි, නමුත් මෙය වඩා හොඳ විය යුතුය. පක්ෂග්‍රාහී යෙදවුම් හඳුනාගෙන නිවැරදි කිරීමට වඩා හොඳ ක්‍රමයක් ගැන මට සිතිය නොහැක.
ටොඩ්

දුර්වල RNG ( System.Random) සමඟ ආරම්භ කිරීම තරමක් මෝඩකමක් වන අතර පසුව ඔබේම කේතයේ කිසිදු නැඹුරුවක් ඇතිවීම වළක්වා ගන්න. “කැස්බෑව ඔප දැමීම” යන ප්‍රකාශය මතකයට එයි.
CodesInChaos

@CodesInChaos දැන් ආධුනිකයා තම ස්වාමියා අභිබවා ගොස් ඇත
ටොඩ්

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 ), නමුත් මෙහි දීර් class පන්තිය පිටපත් කරමි:

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භාවිතයෙන් පසු බැහැර කළ යුතුය.
සහි ආශර්

මම හඳුනාගත නොහැකි ගැටළුව විසඳා ගත්තෙමි, නමුත් මෙය තවමත් අතිශයින්ම සැක සහිත ය, සෑම අකුරකටම නව RNGCryptoServiceProvider නිර්මාණය කරයි.
piojo

4

කොටස් දෙකක් ඒකාබද්ධ කිරීමට උත්සාහ කරන්න: අද්විතීය (අනුක්‍රමය, කවුන්ටරය හෝ දිනය) සහ අහඹු

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;

        using (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)
    {
        const string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //if you wish to make the 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) &&ප්‍රකාශන වලට අනවශ්‍ය වරහන් එකතු කර ඒවාට ප්‍රමුඛතාවයක් ඇති බව පැහැදිලි කිරීමට මම එකතු කරමි , නමුත් ඇත්ත වශයෙන්ම එය ශෛලීය තේරීමක් පමණි.
CodesInChaos

+ 1 නැඹුරුව ඉවත් කිරීමට සහ පරීක්ෂණ එකතු කිරීමට හොඳයි. ඔබේ අහඹු නූල කාලරාමුවකින් ලබාගත් නූලක් සමඟ සූදානම් කරන්නේ මන්දැයි මට විශ්වාස නැත? එසේම, ඔබ තවමත් ඔබේ RNGCryptoServiceProvider බැහැර කළ යුතුය
monty

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

WinRT (Windows Store App) සඳහා එරික් ජේගේ විසඳුමේ ප්‍රභේදයක්, එනම් ගුප්ත විද්‍යාත්මකව ශබ්ද: මෙන්න:

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
මෙය ගුප්ත විද්‍යාත්මක ශබ්දයක් නොවේ . මොඩියුලස් මෙහෙයුම නිසා ulong හි මුළු පළල සමානව අක්ෂර 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
එය එක් පේළියක් වන්නේ කෙසේද? Console.WriteLine (ra "සසම්භාවී නූල්: {Path.GetRandomFileName (). ප්‍රතිස්ථාපනය කරන්න (". "," ")}"); එක් පේළියකි.
PmanAce

1

මෙය කොතරම් ගුප්ත විද්‍යාත්මක ශබ්දයක් දැයි මම නොදනිමි, නමුත් එය වඩා සංකීර්ණ විසඳුම් වලට වඩා කියවිය හැකි හා සංක්ෂිප්ත (ඉමෝ) වන අතර එය System.Randomපදනම් වූ විසඳුම් වලට වඩා “අහඹු” විය යුතුය .

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

මෙම අනුවාදය හෝ ඊළඟ අනුවාදය "ලස්සනයි" කියා මට තීරණය කළ නොහැක, නමුත් ඒවා හරියටම එකම ප්‍රති results ල ලබා දෙයි:

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

ඇත්ත වශයෙන්ම, එය වේගය සඳහා ප්‍රශස්තිකරණය නොකෙරේ, එබැවින් සෑම තත්පරයකම අහඹු නූල් මිලියන ගණනක් උත්පාදනය කිරීම ඉතා වැදගත් නම්, තවත් එකක් උත්සාහ කරන්න!

සටහන: මෙම විසඳුම හෝඩියේ සංකේත පුනරාවර්තනය කිරීමට ඉඩ නොදෙන අතර හෝඩිය ප්‍රතිදාන නූලට වඩා සමාන හෝ විශාල විය යුතුය, සමහර අවස්ථාවල මෙම ප්‍රවේශය අඩු ප්‍රියතාවයක් ඇති කරයි, ඒ සියල්ල ඔබගේ භාවිත අවස්ථාව මත රඳා පවතී.


0

ඔබේ අගයන් සම්පුර්ණයෙන්ම අහඹු නොවේ නම්, නමුත් ඇත්ත වශයෙන්ම යම් දෙයක් මත රඳා පවතී නම් - ඔබට එම 'සොම්විටිං' හි md5 හෝ sha1 හෑෂ් ගණනය කර ඔබට අවශ්‍ය ඕනෑම දිගකට එය කපා දැමිය හැකිය.

ඔබට මාර්ගෝපදේශයක් ජනනය කර කප්පාදු කළ හැකිය.


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සෘජුවම ප්‍රති result ලය භාවිතා කරනවා වෙනුවට දර්ශකය වැඩි කිරීමේ තේරුම කුමක්ද? කේතය සංකීර්ණ කරන අතර ප්‍රයෝජනවත් කිසිවක් අත්කර නොගනී.
CodesInChaos

0

හෝඩිය සහ සංඛ්‍යා නිර්වචනය නොකර අහඹු ඇල්ෆා සංඛ්‍යාත්මක නූලක් ජනනය කිරීමේ යාන්ත්‍රණයක් මෙන්න (මුරපද සහ පරීක්ෂණ දත්ත ජනනය කිරීමට මම මෙය භාවිතා කරමි),

CleanupBase64 මඟින් නූල්වල අවශ්‍ය කොටස් ඉවත් කර අහඹු ලෙස ඇල්ෆා සංඛ්‍යාත්මක අකුරු පුනරාවර්තව එකතු කරනු ඇත.

        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);
              }
     }

පිළිතුරු දිය යුත්තේ ඇයි? මෙම ප්‍රශ්නයට බොහෝ වාර ගණනක් පිළිතුරු ලබා දී ඇති නමුත් ඔබ තවමත් ඔබගේ අඩ වැඩ කරන පිළිතුර පළ කරයි ..
ලෝරන්ට්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.