use Map/WeakMap and better random obj ids