(context 'Foo)
(new Tree 'MAIN:hash) ; must qualify with MAIN, symbol trees are global
(hash "one" 1)
(hash "two" 2)
(println (hash "one")) ; prints 1
(context MAIN)
(println (hash)) ; hash is global
But as a matter of good style, I would pre-define all hashes and pre-create other contexts in a MAIN context module like all other globally used symbols. In bigger newLISP projects or when working with different programmers on the same project clashes/problems are avoided this way.
We call context dictionaries often "hashes", but there is no hash function at the base of it. "Hash" is just a convenient name as most other languages implement lookup functionality using hash functions.
In newLISP dictionaries are built as separate red-black balanced binary trees and only the root of it - the name of the context - is part of the main symbol space. So no namespace "pollution" is taking place.
context is value, so we can use (uuid) to generate unique symbol in MAIN, then make it a context. But there's no gc, you have to delete the context yourself.
(set 'a (new Tree (sym (string "_" (uuid)) MAIN)))
delete the context like this
(set 'name (sym (term a) MAIN)) ; find the context's name in MAIN
(delete name) ; delete the context
(delete name) ; delete the symbol in MAIN