output is deterministic across repeated calls with fresh allocator