Почему итерация занимает так много времени в Ruby? - PullRequest
2 голосов
/ 26 апреля 2019

Эй, я новичок в Ruby и у меня проблема. В моем файле Wordlist содержится более 100 000 слов, и я хочу проверить методом test_password, равен ли мой хэш-код слову из моего файла Wordlist, но когда я проверяю, например, последнее слово в моем файле, для итерации требуется очень много времени. это, пожалуйста, может кто-нибудь помочь мне, как сделать это быстрее?

File.open("Wordlist.txt", "r") do |fi|
  fi.each_line do |words|
    text_word << words.chomp
  end
end

text_word.each do |words|
  if test_password(words,ARGV[0])
    puts "FOUND: " + words
    break
  end
end

1 Ответ

3 голосов
/ 26 апреля 2019

Вы можете создать хеш с парами [hash_code(word), word] один раз и записать результаты в виде JSON, YAML или в базу данных (например, SQLite).Ничего страшного, если для вычисления этого хеша потребуется много времени, потому что вам придется делать это только один раз.В следующий раз вам нужно только прочитать сохраненный хеш, который должен быть быстрым.

Проверка, находится ли слово или хеш-код внутри хеша, должна быть очень быстрой.

ВотНебольшой пример с TODO, оставленными для вас:

require 'json'
require 'digest/md5'

hashcodes = {}

def my_hashcode(word)
  Digest::MD5.hexdigest word
end

# This part is slow, that's okay because it can be saved once and for all and doesn't depend on your input
File.open('/usr/share/dict/american-english') do |wordlist|
  wordlist.each do |word| 
    word.chomp!
    hashcodes[my_hashcode(word)] = word
  end
end

#TODO: Write hashcodes to JSON file
#TODO: Read hashcode from JSON file

# This part depends on your input but is very fast:
some_hashcode = my_hashcode("test")

p hashcodes[some_hashcode]
# => "test"

p hashcodes["S0MEWEIRDH4SH"]
# => nil
...