Module: MovieHasher

Defined in:
lib/movie_hasher.rb

Constant Summary collapse

CHUNK_SIZE =

in bytes

64 * 1024

Class Method Summary collapse

Class Method Details

.compute_hash(filename) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/movie_hasher.rb', line 5

def self.compute_hash(filename)
  filesize = File.size(filename)
  hash = filesize

  # Read 64 kbytes, divide up into 64 bits and add each
  # to hash. Do for beginning and end of file.
  File.open(filename, 'rb') do |f|    
    # Q = unsigned long long = 64 bit
    f.read(CHUNK_SIZE).unpack("Q*").each do |n|
      hash = hash + n & 0xffffffffffffffff # to remain as 64 bit number
    end

    f.seek([0, filesize - CHUNK_SIZE].max, IO::SEEK_SET)

    # And again for the end of the file
    f.read(CHUNK_SIZE).unpack("Q*").each do |n|
      hash = hash + n & 0xffffffffffffffff
    end
  end

  sprintf("%016x", hash)
end