ruby - 如何制作最大长度为 5 的不同长度的字母 (a-z) 数组
ruby - How to make an array of arrays of letters (a-z) of varying lengths with maximum length five
所以我正在尝试制作一个包含字母表字母(全部小写)的所有可能排列的数组,其中字母可以重复并且长度从 1 到 5 不等。例如,这些是一些可能性将在数组中:
['this','is','some','examp','le']
我试过了,它得到了 5 个字母长的单词的所有变体,但我不知道如何找到变长。
("a".."z").to_a.repeated_permutation(5).map(&:join)
编辑:
我正在尝试这样做以破解 SHA1 加密字符串:
require 'digest'
def decrypt_string(hash)
("a".."z").to_a.repeated_permutation(5).map(&:join).find {|elem| Digest::SHA1.hexdigest(elem) == hash}
end
Hash是单词的SHA1加密,如'e6fb06210fafc02fd7479ddbed2d042cc3a5155e'
如果您不介意重复字符串的可能性,那么
e = Enumerator.new do |y|
r = ('a'..'z').to_a * 5
loop do
y << r.shuffle.take(rand(4)+1).join
end
end
应该可以。然后你可以调用 as
e.take(10)
#=> ["bz", "tnld", "jv", "s", "ngrm", "phiy", "ar", "zq", "ajjn", "cn"]
这个:
- 创建 a 到 z 的
Array
重复 5 次
- 不断洗牌说
Array
- 然后从打乱的
Array
中取出前 1 到 5 个(“随机数”)元素并将它们连接在一起
您可以稍微修改一下您的方法。
require 'digest'
def decrypt_string(hash)
arr = ("a".."z").to_a
(1..5).each do |n|
arr.repeated_permutation(n) do |a|
s = a.join
return s if Digest::SHA1.hexdigest(s) == hash
end
end
end
word = "cat"
hash = Digest::SHA1.hexdigest(word)
#=> "9d989e8d27dc9e0ec3389fc855f142c3d40f0c50"
decrypt_string(hash)
#=> "cat"
word = "zebra"
hash = Digest::SHA1.hexdigest(word)
#=> "38aa53de31c04bcfae9163cc23b7963ed9cf90f7"
decrypt_string(hash)
#=> "zebra"
"cat"
的计算在我的 2020 Macbook Pro 上花费了不到一秒钟的时间; "zebra"
的那些花了大约 15 秒。
请注意,join
应在 repeated_permutation
的块中应用,因为 repeated_permutation(n).map(&:join)
会创建一个包含多达 26**5 #=> 11,881,376
个元素的临时数组(对于 n = 5
).
所以我正在尝试制作一个包含字母表字母(全部小写)的所有可能排列的数组,其中字母可以重复并且长度从 1 到 5 不等。例如,这些是一些可能性将在数组中:
['this','is','some','examp','le']
我试过了,它得到了 5 个字母长的单词的所有变体,但我不知道如何找到变长。
("a".."z").to_a.repeated_permutation(5).map(&:join)
编辑:
我正在尝试这样做以破解 SHA1 加密字符串:
require 'digest'
def decrypt_string(hash)
("a".."z").to_a.repeated_permutation(5).map(&:join).find {|elem| Digest::SHA1.hexdigest(elem) == hash}
end
Hash是单词的SHA1加密,如'e6fb06210fafc02fd7479ddbed2d042cc3a5155e'
如果您不介意重复字符串的可能性,那么
e = Enumerator.new do |y|
r = ('a'..'z').to_a * 5
loop do
y << r.shuffle.take(rand(4)+1).join
end
end
应该可以。然后你可以调用 as
e.take(10)
#=> ["bz", "tnld", "jv", "s", "ngrm", "phiy", "ar", "zq", "ajjn", "cn"]
这个:
- 创建 a 到 z 的
Array
重复 5 次 - 不断洗牌说
Array
- 然后从打乱的
Array
中取出前 1 到 5 个(“随机数”)元素并将它们连接在一起
您可以稍微修改一下您的方法。
require 'digest'
def decrypt_string(hash)
arr = ("a".."z").to_a
(1..5).each do |n|
arr.repeated_permutation(n) do |a|
s = a.join
return s if Digest::SHA1.hexdigest(s) == hash
end
end
end
word = "cat"
hash = Digest::SHA1.hexdigest(word)
#=> "9d989e8d27dc9e0ec3389fc855f142c3d40f0c50"
decrypt_string(hash)
#=> "cat"
word = "zebra"
hash = Digest::SHA1.hexdigest(word)
#=> "38aa53de31c04bcfae9163cc23b7963ed9cf90f7"
decrypt_string(hash)
#=> "zebra"
"cat"
的计算在我的 2020 Macbook Pro 上花费了不到一秒钟的时间; "zebra"
的那些花了大约 15 秒。
请注意,join
应在 repeated_permutation
的块中应用,因为 repeated_permutation(n).map(&:join)
会创建一个包含多达 26**5 #=> 11,881,376
个元素的临时数组(对于 n = 5
).