18F/identity-idp

View on GitHub
app/services/binary_search_sorted_hash_file.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

class BinarySearchSortedHashFile
  include ::NewRelic::Agent::MethodTracer

  RECORD_SIZE = 41

  def initialize(file_name)
    @file_name = file_name
  end

  def call(password)
    key = Digest::SHA1.hexdigest(password).upcase
    min = 0
    max = File.size(@file_name) / RECORD_SIZE
    middle = 0
    File.open(@file_name) do |file|
      loop do
        return false if max <= min
        old_middle = middle
        middle = (max + min) / 2
        return false if middle == old_middle
        file.seek middle * RECORD_SIZE
        val = file.readline.chomp
        return true if val == key
        if file.eof? || val > key
          max = middle
        else
          min = middle
        end
      end
    end
  end

  add_method_tracer :call, "Custom/#{name}/call"
end