https://nsvasilev.com/posts/polynomial-hashes/