In this case (alone) I needed to make allocator_type, hasher, and key_equal opaque to deduction using the __identity metafunction. With the original non-opaque aliases, some of the implicit deduction guides from unordered_set's constructors were interfering with deduction from the explicit deduction guides.
Specifically, if you leave typedef _Hash hasher alone:
test/std/containers/unord/unord.set/unord.set.cnstr/deduct.pass.cpp:180:24: note: in instantiation of member function 'std::__1::unordered_set<int, test_allocator<int>, std::__1::equal_to<int>, std::__1::allocator<int> >::unordered_set' requested here std::unordered_set s({ 1, 2, 1, INT_MAX, 3 }, 42, test_allocator<int>(0, 43)); ^
(Here we want to pick up the deduction guide for unordered_set(initializer_list, Size, Allocator) but it looks like overload resolution is preferring the guide implicitly generated from the constructor unordered_set(initializer_list, Size, Hash) instead. I think this might even be correct behavior according to the paper standard. I'll have to check with e.g. Mike Spertus about what's the intent of http://eel.is/c++draft/unord.req#18 "A deduction guide for an unordered associative container shall not participate in overload resolution if ... it has a Hash template parameter and an integral type or a type that qualifies as an allocator is deduced for that parameter." Namely, is this supposed to apply to just the explicit deduction guides, or the implicit ones as well?)