开发者

Random password generation with conditions

开发者 https://www.devze.com 2023-02-18 08:05 出处:网络
I\'m working on a random password generator to create passwords that meet certain conditions including, but not necessarily limited to:

I'm working on a random password generator to create passwords that meet certain conditions including, but not necessarily limited to:

  • minimum length: has to contain at least 8 characters
  • l开发者_如何学Cower case letters: has to contain lower case letters (chosen from a set to avoid problems of having characters that can be mistaken as numbers)
  • upper case letters: has to contain upper case letters (again, chosen from a set)
  • digits: has to contain numbers

What would be the best algorithmic approach to ensure that the generated password meets all these?

I'm not looking for a complete solution, I only need a few good ideas and guidelines.


1) randomly generate number L which will be the exact length of your password. Namely, generate is so that it is greater than 8
2) randomly generate a number LL which will be the number of lowercase letters. LC must be in range [1..L-2]
3) randomly generate number LU for uppercase. Must be in range [1..L-LL-1]
4) LD = L-LL-LU number of uppercase digits
5) randomly generate LL lowercase letters, LU uppercase letters, and LD digits and keep them in a list(array)
6) Shuffle the array randomly

hth


  • create a character array containing a - z, A - Z, 0 - 9 (minus any characters that might be confusing per the question)
  • concatenate 8 randomly chosen characters from the array
  • test the result to see if it satisfies the requirements
  • if the requirements are not satisfied, start over

The algorithm should usually succeed on the first few iterations, and saves you from having to implement a shuffle algorithm.


There is an alternative to the precise construction proposed by Armen. If you're conditions can be met with high probability then:

  • get an infinite length random string (a stream)
  • lazily filter for the acceptable characters (ex: upper case || lower case || digit)
  • step a window of the desired length across the stream, accept when the window properties are OK.

In a lazy language this is about 6 lines of non-boilerplate code and doesn't require any shuffling.

EDIT: Yes, step a window as in the comments, not slide a window. Thanks!

0

精彩评论

暂无评论...
验证码 换一张
取 消