我正在嘗試用Ruby創建密碼生成器。目前一切正常,只是在生成密碼的最后一環卡住了。
我問用戶,他/她是否希望密碼包括數字、小寫或大寫。 如果是,用戶將輸入1,而0則是NO。
我使用下面的代碼來生成密碼,如果一切都為1,意味著用戶希望包括數字、小寫和大寫。
if numbers == 1 & & 小寫 == 1 && 大寫 == 1 。
passGen = [(0...9).to_a ('A'.'Z') 。 to_a ('a'...'z').to_a].flatten.same(10)
結束。
p passGen
這在90%的情況下是有效的。10%的時候,生成的密碼將不包括說任何數字。但其他一切都存在。我不確定這是否是由于對密碼進行采樣的陣列的大小或長度造成的。
無論如何,讓我們進入下面的主要問題
。問題來了,我正在努力撰寫代碼來生成密碼,如果一個或多個輸入是0的話。或者沒有數字和大寫字母等等。因為我無法預測用戶可能想要或不想要什么。我需要這方面的幫助。 謝謝你。
uj5u.com熱心網友回復:
你將需要使你的輸入陣列更加動態:
passGen = [] 。
passGen = (0...9).to_a if figures == 1
passGen = ('A'.'Z').to_a if大寫 == 1.
passGen = ('a'.'z').to_a if lowercase == 1
passGen.sample(10).join
現在,為了解決你的另一個問題,即缺失字符的問題--這是由于你只是從一個陣列中隨機抽取10個字符造成的。所以它可以只取,例如,所有的數字。
為了解決這個問題,你需要先從每個生成器中獲取一個字符,然后隨機生成其余的字符,并對結果進行洗牌。
def generators(numbers。 , 小寫:, 大寫:)
[
(0...9 if numbers)。
('A'...'Z' if 大寫字母)。
('a'...'z' if lowercase)
].compact.map(&:to_a)
結束。
def generate_password(generators: , length:, min_per_generator: 1)
chars = generators.flat_map {|g| Array.new(min_per_generator) { g.sample } }
chars = Array.new(length - chars.length) { generators.sample.sample }
chars.shuffle.join
結束。
gens = generators(numbers: numbers ==1, uppercase ==1, lowercase: lowercase ==1)
Array.new(10) { generate_password(generators: gens, length: 10) }
uj5u.com熱心網友回復:
通過說(0...9).to_a ('A'...'Z').to_a ('a'...'z').to_a,你正在創建一個由10 26 26 = 62個元素組成的陣列,然后你只從其中挑選10個元素。
在你的地方,我會用until塊來包裝密碼生成:
def generate_password_with_digits_and_caps
[(0...9).to_a ('A'.'Z'). to_a ('a'...'z').to_a].flattenten.sample(10).join
end。
passGen = ''。
until passGen.match(/[A-Z]/) && passGen. match(/[a-z]/) && passGen.match(/d/)
passGen = generate_password_with_digits_and_caps
結束。
這樣做也可以(更接近于你的代碼段):
if numbers == 1 & & 小寫 == 1 && 大寫 == 1 。
passGen = ''/span>
until passGen.match(/[A-Z]/) && passGen. 匹配(/[a-z]/) && passGen.匹配(/d/)
passGen = [(0...9).to_a ('A'.'Z')。 to_a ('a'...'z').to_a].flattenten.sample(10).join
end。
結束。
uj5u.com熱心網友回復:
代碼不知道它需要包括每組中的一個數字/字母。該樣本采取隨機符號,由于你基本上是在取樣0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,有可能所有的符號都不是數字。
最簡單的解決方法是檢查 "密碼 "中是否有每組的符號,然后用一組不存在的符號替換隨機的符號。
如果讓我來編程,我會這樣做的
。
def random_from_range(range)<
范圍.到_a.樣本.到_s
end
def passGen(數字、小寫、大寫)
結果 = ''/span>
可能的符號 = []
if numbers == 1
range = (0.9)
result = random_from_range(range)
possibleSigns = range.to_a
結束。
if lowercase == 1
range = ('A'.'Z')
result = random_from_range(range)
possibleSigns = range.to_a
結束。
if大寫 == 1
range = ('a'.'z')
result = random_from_range(range)
possibleSigns = range.to_a
結束。
desired_lenth = 10 end
while result.length < desired_lenth
結果 = possibleSigns.sample.to_s
end
結果
end end 結果
puts passGen(1,1, 1)
uj5u.com熱心網友回復:
從簡單而愚蠢的事情開始:
passGen = (('0'/span>. '9').to_a.sample(1) ('A'。 .'Z').to_a.sample(1) ('a'。 .'z').to_a.sample(8).shuffle).join
從技術上講,這已經滿足了你的要求。從美學和安全的角度來看,這里的缺點是大寫字母的數量始終是8。一個更優雅的解決方案是找到三個非零的整數,它們加起來是10,可以作為sample呼叫的引數。此外,如果沒有要求任何數字,你只需將0作為引數傳遞給sample。
由于這超出了你的問題的范圍,我甚至不知道你是否想走到這一步,我不會在這里進一步闡述。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/313787.html
標籤:
