The macro has no arguments or computation besides instantiating the return expression, so it’s just pasting that with generated local variables into macro call sites. global_random_seed is just a symbol in the expression, so it’s going to work like any global variable in a macro-less method. The bad type inference isn’t saved by the UInt64 call alone because the language doesn’t mandate type constructors return their own type; it’s saved by the only hash(::String, ...) method returning UInt.
Could do global_random_seed::Int for inherent type stability (or why not ::UInt64 if that’s all you’ll use it for), though non-const global variables require assignment checks and is thus implemented by a reference to a reference the last time I checked. Indexing and mutating const global_random_seed = Ref(123) would halve the work, though there is the risk of reading garbage values “assigned” to an uninitialized Ref{Int}(). The performance gain was actually dubious then, not sure how CPUs handled things.