class XXhash::XXhashInternal::XXhash32

Attributes

v1[RW]
v2[RW]
v3[RW]
v4[RW]

Public Class Methods

new(seed) click to toggle source
# File lib/ruby-xxhash32.rb, line 15
def initialize seed
  @seed = seed
  reset
end

Public Instance Methods

digest(val=nil) click to toggle source
# File lib/ruby-xxhash32.rb, line 72
def digest val=nil
  if val
    update val
  end

  if @total_len >= 16
    h32 = ((@v1 << 1) | (@v1 >> (32 - 1))) +
      ((@v2 << 7) | (@v2 >> (32 - 7))) +
      ((@v3 << 12) | (@v3 >> (32 - 12))) +
      ((@v4 << 18) | (@v4 >> (32 - 18)))
  else
    h32 = @seed + @@prime32_5
  end

  h32 = uint32(h32 + @total_len)

  p = 0
  while p <= (@memsize - 4)
    p32 = uint32(@memory[p] |
                   (@memory[p+1] << 8) |
                   (@memory[p+2] << 16) |
                   (@memory[p+3] << 24))
    h32 = uint32(h32 + p32 * @@prime32_3)
    h32 = uint32(uint32((h32 << 17) | (h32 >> (32 - 17))) * @@prime32_4)
    p += 4
  end

  while p < @memsize
    h32 = uint32(h32 + @memory[p] * @@prime32_5)
    h32 = uint32(uint32((h32 << 11) | (h32 >> (32 - 11))) * @@prime32_1)
    p += 1
  end

  h32 ^= h32 >> 15
  h32 = uint32(h32 * @@prime32_2)
  h32 ^= h32 >> 13
  h32 = uint32(h32 * @@prime32_3)
  h32 ^= h32 >> 16

  h32
end
reset() click to toggle source
# File lib/ruby-xxhash32.rb, line 20
def reset
  @v1 = @seed + @@prime32_1 + @@prime32_2
  @v2 = @seed + @@prime32_2
  @v3 = @seed + 0
  @v4 = @seed - @@prime32_1
  @total_len = 0
  @memory = Array.new(@@mem_total_size)
  @memsize = 0
end
update(bytes) click to toggle source
# File lib/ruby-xxhash32.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|
      p32 = uint32(
        @memory[i] |
          (@memory[i+1] << 8) |
          (@memory[i+2] << 16) |
          (@memory[i+3] << 24))

      v = uint32(self.send(m) + p32 * @@prime32_2)
      v = uint32(uint32((v << 13) | (v >> (32 - 13))) * @@prime32_1)
      self.send((m.to_s + "=").to_sym, v)
      i += 4
    end

    p += mem_avail
    @memsize = 0
  end

  return true
end

Private Instance Methods

uint32(x) click to toggle source
# File lib/ruby-xxhash32.rb, line 118
def uint32(x)
  x & @@thirtytwo1s
end