Consider a service $S$ that receives hashes of documents from a number of providers. If two hashes match, it notifies the providers. We do not want anyone at the service to be able to identify the documents. However, the document space is actually quite small (~billions) so a dictionary attack is possible.
One solution would be the creation and provision of an HMAC key out of band between the data providers. If the service never has access to it, then it could not perform the dictionary attack. This is a bit cumbersome though and an automated approach would be preferred.
Basic logic would dictate that if any provider can use a non-secret method to generate a hash from a document, then the central service can also use that known method to perform the same hash in order to carry out the dictionary attack.
Therefore, to avoid this attack, there must be some secret shared between providers that is unknown to the central service.
Note that 10 billion 128-bit hashes would only require 150GB of storage. You might therefore decide that it is better for the providers to simply share their hashes directly with one another. You can use a Dandelion protocol so that when new hashes are announced, the provider originally announcing any particular hash has their identity concealed.