Gnutella and Gnutella2 used something like a single hash bloom filter to route p2p file queries across the mesh in a less wasteful manner. It was not perfect, but it worked enough to scale to very large user counts.
https://rickcarlino.com/notes/p2p/how-gnutella-scaled-to-han...