टिप्पणी: मैं ओपी के यूज-केस विचलन के बारे में पता कर रहा हूँ, लेकिन मुझे लगता है कि जो दूसरों एक अलग यूज-केस
एक बहुत के बारे में कहा जा सकता है मदद कर सकता है एक क्रिप्टोग्राफिक बाइट सरणी को एक स्ट्रिंग में परिवर्तित करने के कारण, लेकिन आमतौर पर यह किसी प्रकार के क्रमिक उद्देश्यों के लिए होता है; और इसलिए, उस मामले में: चयनित चरित्र सेट मनमाने ढंग से है।
तो, यदि, और केवल तभी यदि सत्य सत्य है और स्ट्रिंग की लंबाई को अनुकूलित करने की आवश्यकता नहीं है; आप इस तरह से बाइट सरणी के एक सरल हेक्साडेसिमल प्रतिनिधित्व का उपयोग कर सकते हैं:
//note: since the choice of characters [0..9a..zA...Z] is arbitrary,
//limiting to [0..9,A..F] would seem to be a really big problem if it can be compensated
//by the length.
var rnd = new RNGCryptoServiceProvider();
var sb = new StringBuilder();
var buf = new byte[10]; //length: should be larger
rnd.GetBytes(buf);
//gives a "valid" range of: "ABCDEF"
foreach (byte b in buf)
sb.AppendFormat("{0:x2}", b);
//sb contains a RNGCryptoServiceProvider based "string"
अब आप कहूँगा: लेकिन इंतजार: इनमें से केवल 16 वर्णों जहां ओपी के अनुक्रम 62. आपका स्ट्रिंग है हो जाएगा एक बहुत लंबे समय तक कर रहे हैं।
"हाँ", मैं जवाब देंगे, "और है कि अगर कोई समस्या है, तुम क्यों 256 आसानी से पढ़ने के लिए और serrializable-वर्ण लेने नहीं है ... या शायद 64"; -)
@Guffa ने कहा; %
का उपयोग तब तक प्रतिबंधित है जब तक यह वितरण को परिवर्तित नहीं करता है। ऐसा करने के लिए, समान रूप से वितरित सेट दिया गया है, मूल सेट में सबसेट को x बार फिट होना चाहिए।
तो, 2 के साथ अपने प्रारंभिक वैध सेट को विस्तारित करने से वैध परिणाम मिलता है (क्योंकि: 256/64 = 4)।
कोड होगा:
//note: added + and/chars. could be any of them
const string valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+/";
var rnd = new RNGCryptoServiceProvider();
var sb = new StringBuilder();
var buf = new byte[10]; //length: should be larger
rnd.GetBytes(buf); //get the bytes
foreach (byte b in buf)
sb.Append(valid[b%64]);
कृपया ध्यान दें: इस एक, उप-सेट बाइट की 256 संभावनाओं से छोटी है सहित सभी प्रश्नों के उत्तर, में। इसका मतलब है कि कम जानकारी उपलब्ध है। इसका मतलब है कि यदि आपके पास 4 वर्णों के साथ आपकी स्ट्रिंग है, तो RNGCryptoServiceProvider के मूल 4 बाइट परिणाम को क्रैक करना आसान है।
तो ... अब आप कहते हैं: "64 बेस एन्कोडिंग का उपयोग क्यों नहीं करें?", ठीक है, सूट आप अगर यह है, लेकिन पीछे चल =
के साथ सावधान रहना, Base64 on Wikipedia देखें:
var rnd = new RNGCryptoServiceProvider();
var buf = new byte[60]; //length not randomly picked, see 64Base, wikipedia
rnd.GetBytes(buf);
string result = Convert.ToBase64String(buf);
कृपया note²: एक ठेठ उपयोग के मामले में कुछ यूआरएल टोकन है। कृपया ध्यान दें कि +
साइन इन वर्ण के रूप में अमान्य है।
जब आप बाइट मानों को किसी विशिष्ट श्रेणी में परिवर्तित करते हैं तो आपको सावधान रहना होगा। यदि आप केवल '%' का उपयोग करते हैं तो यह असमान वितरण के साथ संख्याएं उत्पन्न करेगा, और एक बेहतर यादृच्छिक जनरेटर का उपयोग करने का पूरा उद्देश्य व्यर्थ है। – Guffa
यह सच है, मैं अपना जवाब पोस्ट करने के बाद जोड़ना चाहता था। Tamir Vered का जवाब बहुत दिलचस्प है हालांकि बहुत अक्षम है क्योंकि यह स्ट्रिंगबिल्डर का उपयोग नहीं करता है। यह बाइट्स को इनपुट के रूप में स्वीकार नहीं करता है, जो एक दिलचस्प समाधान है और इसके साथ उचित वितरण होगा – hl3mukkel