#include #include #include #include "mod311.h" struct hash311 { uint32_t x, c; }; void key311(struct hash311 *h) { h->x = arc4random_uniform(M31); h->c = arc4random_uniform(M31); } uint32_t hash311(struct hash311 *h, const void *buf, size_t len) { const uint32_t x = h->x; const uint8_t *p = buf; uint32_t y = 0; while (len --> 0) y = mul311(x, add311(y, 0x100 | *p++)); return reduce311(add311(y, h->c)); }