Cuckoo filters for non powers-of-2 The Cuckoo filters paper (https://www.cs.cmu.edu/~dga/papers/cuckoo-conext2014.pdf) claims a 95% load factor, however it seems to make an implicit assumption that the table size is a power of 2, and their implementation also enforces that (https://github.com/efficient/cuckoofilter/blob/master/src/cuckoofilter.h#L90). This means that the load factor can be as bad as ~50%, depending on the number of keys.

The reason seems to be intrinsic to the alternate index algorithm: it is 
$$
h_2(x) = h_1(x) \oplus hash(signature) 
$$
The XOR makes the algorithm an involution (so the same formula holds to find $h_1$ from $h_2$), but the result is smaller than the table size only if the size is a power of 2.

Is there an alternative formula that works with non-powers of two? Basically something that pseudo-randomly maps signatures to involutions of [0, n).
Yes, it is possible.  Use

$$h_2(x) = \text{hash}(\text{signature}) - h_1(x) \bmod n.$$

The theory behind this: if $c$ is a constant, the function

$$f(t) = c - t \bmod n$$

is an involution for any $c$ and any $n$, since

$$f(f(t) = c - (c-t) = t \pmod n.$$

Therefore, we can use the hash of the signature as the constant $c$.  This gives you a scheme that works for any $n$, without requiring that $n$ be a power of two.