[Rabin-Karp string search](https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm) would be a good candidate, because it can use a [rolling hash](https://en.wikipedia.org/wiki/Rolling_hash) function.

You pick a segment length $\ell$.  For each "needle", you hash its first $\ell$ characters, and store it in a hashtable keyed on the hash.

Then, as each character of text arrives, you compute the rolling hash of the last $\ell$ characters, look it up in the hash table, and possibly find one or more candidate needles that might match; then you test them directly.

This requires that the segment length be shorter than the shortest needle, but long enough to make hash collisions rare (i.e., so that the first $\ell$ characters of a needle mostly uniquely determines the needle).  If you have a wide range of needle lengths, I suppose you could pick two segment lengths $\ell_1,\ell_2$, have two hash tables, and store each needle in appropriate hashtable according to its length.