// Package hasher contains Telegram pagination hash implementation.
package hasher

// Hasher implements Telegram pagination hash counting.
//
// See https://core.telegram.org/api/offsets#hash-generation.
type Hasher struct {
	state uint32
}

// Reset resets the Hasher to its initial state.
func (h *Hasher) Reset() {
	h.state = 0
}

// Update performs state change using given value.
func (h *Hasher) Update(value uint32) {
	h.state = (h.state * 20261) + value
}

// Update64 performs state change using given 64-bit value.
func (h *Hasher) Update64(value uint64) {
	h.Update(uint32(value >> 32))
	h.Update(uint32(value & 0xFFFFFFFF))
}

// Sum returns final sum.
func (h *Hasher) Sum() int64 {
	return int64(h.state & 0x7FFFFFFF)
}
