works nicely where
length(a) == length(allnames(a,b))
# and
allnames(a,b) =
Tuple(union(fieldnames(typeof(a)), fieldnames(typeof(b))))
≊(x::NamedTuple{N,T}, y::NamedTuple{N2,T2}) where {N,T,N2,T2} =
length(N) === length(union(N,N2)) &&
all(k->getfield(x,k) == getfield(y,k), keys(x))
a = (x=1, y=2)
b = (y=2, x=1)
a ≊ b # true