I used an own implementation of bloom filter. This is pretty easy, but you need good hash functions.
I usually use them as an optimization to avoid disk reads. If the program wants to read a value from disk or search for a value on disk, I use a bloom filter of all values to avoid the disk read if the bloom filter returns a negative answer. The program would also be correct without the bloom filter, but when there is a signification chance that the value is not stored on disk -- and therefore the disk read would be useless -- the bloom filter is a nice optimization.
In another scenario I used a bloom filter to hold a "set" of all values that have been touched in some time period. In that specific situation, I did't care about the false positives, it was more important that each value actually touched is "covered". One nice aspect of bloom filters here are that the have a constant size in contrast to a read set. Ok, the error rate might go up, but in that situation I could live with that.