An implementation of the Rabin-Karp algorithm. The main idea of this
algorithm is to maintain a rolling hash as it moves through the input, and
then check whether that hash corresponds to the same hash for any of the
patterns we’re looking for.
The number of buckets to store our patterns in. We don’t want this to be
too big in order to avoid wasting memory, but we don’t want it to be too
small either to avoid spending too much time confirming literals.