class XXhash::XXhashInternal::XXhash64
Attributes
v1[RW]
v2[RW]
v3[RW]
v4[RW]
Public Class Methods
new(seed)
click to toggle source
# File lib/ruby-xxhash64.rb, line 15 def initialize seed @seed = seed reset end
Public Instance Methods
digest(val=nil)
click to toggle source
# File lib/ruby-xxhash64.rb, line 72 def digest val=nil if val update val end if @total_len >= 32 h64 = ((@v1 << 1) | (@v1 >> (64 - 1))) + ((@v2 << 7) | (@v2 >> (64 - 7))) + ((@v3 << 12) | (@v3 >> (64 - 12))) + ((@v4 << 18) | (@v4 >> (64 - 18))) [:v1, :v2, :v3, :v4].each do |m| v = uint64(self.send(m) * @@prime64_2) v = uint64((v << 31) | (v >> (64 - 31))) h64 ^= uint64(v * @@prime64_1) h64 = h64 * @@prime64_1 + @@prime64_4 end else h64 = @seed + @@prime64_5 end h64 = uint64(h64 + @total_len) i = 0 while i <= (@memsize - 8) v = uint64( @memory[i] | (@memory[i+1] << 8) | (@memory[i+2] << 16) | (@memory[i+3] << 24) | (@memory[i+4] << 32) | (@memory[i+5] << 40) | (@memory[i+6] << 48) | (@memory[i+7] << 56)) v = uint64(v * @@prime64_2) h64 ^= uint64(uint64((v << 31) | (v >> (64 - 31))) * @@prime64_1) h64 = uint64(uint64((h64 << 27) | (h64 >> (64 - 27))) * @@prime64_1 + @@prime64_4) i += 8 end if i <= (@memsize - 4) v = @memory[i] | (@memory[i+1] << 8) | (@memory[i+2] << 16) | (@memory[i+3] << 24) h64 ^= uint64(v * @@prime64_1) h64 = uint64(uint64((h64 << 23) | (h64 >> (64-23))) * @@prime64_2 + @@prime64_3) i += 4 end while i < @memsize h64 ^= uint64(@memory[i] * @@prime64_5) h64 = uint64(uint64((h64 << 11) | (h64 >> (64 - 11))) * @@prime64_1) i += 1 end h64 ^= h64 >> 33 h64 = uint64(h64 * @@prime64_2) h64 ^= h64 >> 29 h64 = uint64(h64 * @@prime64_3) h64 ^= h64 >> 32 h64 end
reset()
click to toggle source
# File lib/ruby-xxhash64.rb, line 20 def reset @v1 = @seed + @@prime64_1 + @@prime64_2; @v2 = @seed + @@prime64_2; @v3 = @seed + 0; @v4 = @seed - @@prime64_1; @total_len = 0 @memory = Array.new(@@mem_total_size) @memsize = 0 end
update(bytes)
click to toggle source
# File lib/ruby-xxhash64.rb, line 30 def update bytes if String === bytes bytes = bytes.unpack("C*") end @total_len += bytes.length p = 0 while (remaining = (bytes.length - p)) > 0 mem_avail = @@mem_total_size - @memsize if(remaining < mem_avail) @memory[@memsize, remaining] = bytes[p, remaining] @memsize += remaining break end @memory[@memsize, mem_avail] = bytes[p, mem_avail] i = 0 [:v1, :v2, :v3, :v4].each do |m| p64 = uint64( @memory[i] | (@memory[i+1] << 8) | (@memory[i+2] << 16) | (@memory[i+3] << 24) | (@memory[i+4] << 32) | (@memory[i+5] << 40) | (@memory[i+6] << 48) | (@memory[i+7] << 56)) v = uint64(self.send(m) + p64 * @@prime64_2) v = uint64(uint64((v << 31) | (v >> (64 - 31))) * @@prime64_1) self.send((m.to_s + "=").to_sym, v) i += 8 end p += mem_avail @memsize = 0 end end
Private Instance Methods
uint64(x)
click to toggle source
# File lib/ruby-xxhash64.rb, line 142 def uint64(x) x & @@sixtyfour1s end