id() is guaranteed to be stable for the lifetime of the object, but the identifier can be reused if the object is destroyed.
The 0x prefix is always going to be there when using hex(). You could also use format(..., 'x') to format to a hex number without a prefix:
>>> a = 7
>>> print format(id(a), 'x')
7f866b425e58
You'd be better of just using a itertools.count() object to produce your unique ids, perhaps with a prefix or by negating the number if you need to distinguish these from others:
from itertools import count
id_counter = count()
and each time you need a new id, use:
next(id_counter)
and store this as an attribute on your instances. You can make the count() count down by giving it a negative step:
id_counter = count(-1, -1)
Demo:
>>> from itertools import count
>>> id_counter = count(-1, -1)
>>> next(id_counter)
-1
>>> next(id_counter)
-2