How to generate a random string, and specify the length you want, or better generate unique string on specification you want
有一个生成随机数的库,为什么没有一个生成随机字符串的库呢?
换句话说,如何生成一个随机字符串,并指定所需的长度,或者更好,根据您想要的规范生成唯一字符串,即指定长度,我的应用程序中的唯一字符串就足够了。
我知道我可以创建一个guid(全局唯一标识符),但它们很长,需要的时间更长。
1 2 3 4 | int length = 8; string s = RandomString.NextRandomString(length) uniquestringCollection = new UniquestringsCollection(length) string s2 = uniquestringCollection.GetNext(); |
我想不起来我是从哪里得到这个的,所以如果你知道谁最初写了这个,请帮助我给出归属。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | private static void Main() { const string AllowedChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#@$^*()"; Random rng = new Random(); foreach (var randomString in RandomStrings(AllowedChars, 1, 16, 25, rng)) { Console.WriteLine(randomString); } Console.ReadLine(); } private static IEnumerable<string> RandomStrings( string allowedChars, int minLength, int maxLength, int count, Random rng) { char[] chars = new char[maxLength]; int setLength = allowedChars.Length; while (count-- > 0) { int length = rng.Next(minLength, maxLength + 1); for (int i = 0; i < length; ++i) { chars[i] = allowedChars[rng.Next(setLength)]; } yield return new string(chars, 0, length); } } |
怎么样?
1 2 3 4 5 6 7 8 9 10 11 12 13 | static Random rd = new Random(); internal static string CreateString(int stringLength) { const string allowedChars ="ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz0123456789!@$?_-"; char[] chars = new char[stringLength]; for (int i = 0; i < stringLength; i++) { chars[i] = allowedChars[rd.Next(0, allowedChars.Length)]; } return new string(chars); } |
我通常使用如下代码生成随机字符串:
1 2 3 4 5 6 7 8 |
这将创建随机对象生成的随机字节的base64编码字符串。它不是线程安全的,因此多个线程必须锁定它。另外,我使用了一个静态随机对象,因此同时对该方法的两个调用不会得到相同的初始种子。
用于生成随机字符串的库不是很有用。它要么太简单,以至于你经常需要替换它,要么太复杂,为了能够覆盖任何可能的情况,你替换它,因为它使用起来很复杂。
通过使用数字的随机生成器,创建随机字符串是非常容易的,给出了您需要的确切细节。专门为每种情况编写代码只是更有效。
如果您想要一个唯一的字符串,有两种可能。您可以保留创建的每个随机字符串,以便检查其唯一性,也可以使其非常长,这样就不太可能出现重复。guid执行后者(这解释了为什么它如此长),因此已经有了一个实现。
怎么样
或
string.Join("", Enumerable.Repeat(0, 100).Select(n => (char)rand.Next(127))));
使用连接的guid的随机字符串
这种方法使用连接的guid的最小数量来返回所需字符数的随机字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /// <summary> /// Uses concatenated then SubStringed GUIDs to get a random string of the /// desired length. Relies on the randomness of the GUID generation algorithm. /// </summary> /// <param name="stringLength">Length of string to return</param> /// <returns>Random string of <paramref name="stringLength"/> characters</returns> internal static string GetRandomString(int stringLength) { StringBuilder sb = new StringBuilder(); int numGuidsToConcat = (((stringLength - 1) / 32) + 1); for(int i = 1; i <= numGuidsToConcat; i++) { sb.Append(Guid.NewGuid().ToString("N")); } return sb.ToString(0, stringLength); } |
长度为8的示例输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 39877037 2f1461d8 152ece65 79778fc6 76f426d8 73a27a0d 8efd1210 4bc5b0d2 7b1aa10e 3a7a5b3a 77676839 abffa3c9 37fdbeb1 45736489 |
长度为40的示例输出(请注意,在v4 guid中,重复出现的"4"是一个十六进制数字,它始终是4位(有效地删除了4位)--如果字符串的返回长度可以小于guid的长度(32个字符),则可以通过删除"4"来改进算法以提高随机性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | e5af105b73924c3590e99d2820e3ae7a3086d0e3 e03542e1b0a44138a49965b1ee434e3efe8d063d c182cecb5f5b4b85a255a397de1c8615a6d6eef5 676548dc532a4c96acbe01292f260a52abdc4703 43d6735ef36841cd9085e56f496ece7c87c8beb9 f537d7702b22418d8ee6476dcd5f4ff3b3547f11 93749400bd494bfab187ac0a662baaa2771ce39d 335ce3c0f742434a904bd4bcad53fc3c8783a9f9 f2dd06d176634c5b9d7083962e68d3277cb2a060 4c89143715d34742b5f1b7047e8107fd28781b39 2f060d86f7244ae8b3b419a6e659a84135ec2bf8 54d5477a78194600af55c376c2b0c8f55ded2ab6 746acb308acf46ca88303dfbf38c831da39dc66e bdc98417074047a79636e567e4de60aa19e89710 a114d8883d58451da03dfff75796f73711821b02 |
C小提琴手演示:https://dotnetfiddle.net/y1j6dw
像这样的东西怎么样…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | static string GetRandomString(int lenOfTheNewStr) { string output = string.Empty; while (true) { output = output + Path.GetRandomFileName().Replace(".", string.Empty); if (output.Length > lenOfTheNewStr) { output = output.Substring(0, lenOfTheNewStr); break; } } return output; } |
产量
1 2 3 4 5 6 7 8 9 | static void Main(string[] args) { for (int x = 0; x < 10; x++) { string output = GetRandomString(20); Console.WriteLine(output); } Console.ReadKey(); } |
nbsp;
1 2 3 4 5 6 7 8 9 10 | r323afsluywgozfpvne4 qpfumdh3pmskleiavi3x nq40h0uki2o0ptljxtpr n4o0rzwcz5pdvfhmiwey sihfvt1pvofgxfs3etxg z3iagj5nqm4j1f5iwemg m2kbffbyqrjs1ad15kcn cckd1wvebdzcce0fpnru n3tvq0qphfkunek0220d ufh2noeccbwyfrtkwi02 |
在线演示:https://dotnetfiddle.net/pvgf0k
工具书类?https://www.dotnetperls.com/random-string
您已经回答了自己的问题;没有random string()函数,因为您可以使用随机数生成器轻松生成字符串。
1)在要包含的ASCII字符之间设置数字范围
2)将每个字符附加到一个字符串,直到达到所需的长度。
3)对所需的每个字符串进行上升和重复(将它们添加到数组中等)。
当然可以吗?