我正在嘗試在 ruby?? 中創建密碼生成。目前一切正常,只是卡在生成密碼的最后一塊。
我問用戶他/她是否希望密碼包含數字、小寫或大寫。如果是,用戶將輸入 1 和 0 表示否。
如果一切都是 1,我使用下面的代碼生成密碼。這意味著用戶想要包括數字、小寫和大寫。
if numbers == 1 && lowercase == 1 && uppercase == 1
passGen = [(0..9).to_a ('A'..'Z').to_a ('a'..'z').to_a].flatten.sample(10)
end
p passGen
這在 90% 的時間里都有效。10% 的時間生成的密碼不會包含任何數字。但其他一切都存在。我不確定這是否是因為從中采樣密碼的陣列的大小或長度。
無論如何,讓我們轉到下面的主要問題
這是問題所在,如果一個或多個輸入為 0,我正在努力撰寫生成密碼的代碼。那就是如果用戶不想包含數字。或者沒有數字和大寫等。因為我無法預測用戶可能想要或不想要什么。我需要這方面的幫助。謝謝你。
uj5u.com熱心網友回復:
您需要使輸入陣列更加動態:
passGen = []
passGen = (0..9).to_a if numbers == 1
passGen = ('A'..'Z').to_a if uppercase == 1
passGen = ('a'..'z').to_a if lowercase == 1
passGen.sample(10).join
現在,要解決缺少字符的其他問題 - 這是因為您只是從陣列中獲取 10 個隨機字符。例如,它可以只取所有數字。
要解決這個問題,您需要先從每個生成器中獲取一個字符,然后隨機生成剩余的字符并將結果打亂:
def generators(numbers:, lowercase:, uppercase:)
[
(0..9 if numbers),
('A'..'Z' if uppercase),
('a'..'z' if lowercase)
].compact.map(&:to_a)
end
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
end
gens = generators(numbers: numbers == 1, uppercase == 1, lowercase: lowercase == 1)
Array.new(10) { generate_password(generators: gens, length: 10) }
uj5u.com熱心網友回復:
該代碼不知道它需要包含每個組的數字/字母。該樣本采用隨機符號,并且由于您基本上是抽樣0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,因此所有符號都可能不是數字。
修復它的最簡單方法是檢查每個組的符號是否在“密碼”中,然后用不存在的組中的符號替換隨機符號。
如果我要對此進行編程,我會那樣做
def random_from_range(range)
range.to_a.sample.to_s
end
def passGen(numbers, lowercase, uppercase)
result = ''
possibleSigns = []
if numbers == 1
range = (0..9)
result = random_from_range(range)
possibleSigns = range.to_a
end
if lowercase == 1
range = ('A'..'Z')
result = random_from_range(range)
possibleSigns = range.to_a
end
if uppercase == 1
range = ('a'..'z')
result = random_from_range(range)
possibleSigns = range.to_a
end
desired_lenth = 10
while result.length < desired_lenth
result = possibleSigns.sample.to_s
end
result
end
puts passGen(1,1,1)
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].flatten.sample(10).join
end
passGen = ''
until passGen.match(/[A-Z]/) && passGen.match(/[a-z]/) && passGen.match(/\d/)
passGen = generate_password_with_digits_and_caps
end
這也可以作業(更接近你的片段):
if numbers == 1 && lowercase == 1 && uppercase == 1
passGen = ''
until passGen.match(/[A-Z]/) && passGen.match(/[a-z]/) && passGen.match(/\d/)
passGen = [(0..9).to_a ('A'..'Z').to_a ('a'..'z').to_a].flatten.sample(10).join
end
end
uj5u.com熱心網友回復:
從簡單而愚蠢的事情開始:
passGen = (('0'..'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/qukuanlian/416208.html
標籤:
上一篇:比較專案的URL結構
下一篇:ImagesController#import中的NoMethodError/Image:Class的未定義方法“匯入”
