# File lib/gettext/mo.rb, line 186
  def save_to_stream(io)
    #Save data as little endian format.
    header_size = 4 * 7
    table_size  = 4 * 2 * size

    hash_table_size = next_prime((size * 4) / 3) 
    hash_table_size = 3 if hash_table_size <= 2
    header = Header.new(
      MAGIC_LITTLE_ENDIAN,          # magic
      0,                            # revision
      size,                         # nstrings
      header_size,                  # orig_table_offset
      header_size + table_size,     # translated_table_offset
      hash_table_size,              # hash_table_size
      header_size + table_size * 2  # hash_table_offset
    )
    io.write(header.to_a.pack('a4V*'))

    ary = to_a
    ary.sort!{|a, b| a[0] <=> b[0]} # sort by original string

    pos = header.hash_table_size * 4 + header.hash_table_offset

    orig_table_data = Array.new()
    ary.each{|item, _|
      orig_table_data.push(item.size)
      orig_table_data.push(pos)
      pos += item.size + 1 # +1 is <NUL>
    }
    io.write(orig_table_data.pack('V*'))

    trans_table_data = Array.new()
    ary.each{|_, item|
      trans_table_data.push(item.size)
      trans_table_data.push(pos)
      pos += item.size + 1 # +1 is <NUL>
    }
    io.write(trans_table_data.pack('V*'))

    hash_tab = Array.new(hash_table_size)
    j = 0
    ary[0...size].each {|key, _|
      hash_val = hash_string(key)
      idx = hash_val % hash_table_size
      if hash_tab[idx] != nil
        incr = 1 + (hash_val % (hash_table_size - 2))
        begin
          if (idx >= hash_table_size - incr)
            idx -= hash_table_size - incr
          else
            idx += incr
          end
        end until (hash_tab[idx] == nil)
      end
      hash_tab[idx] = j + 1
      j += 1
    }
    hash_tab.collect!{|i| i ? i : 0}

    io.write(hash_tab.pack('V*'))

    ary.each{|item, _| io.write(item); io.write("\0") }
    ary.each{|_, item| io.write(item); io.write("\0") }

    self
  end