Are you going to use these values temporarily? I assume that is the case if you are not going to store them in the database. In that case you might simply generate a 16-character random string and use it as an ID. The probability of a collision is so low that in practical terms it's insignificant unless you are using them for systems where absolute security is critical. You could also generate a random hash for this purpose. As fellgall said, you are not guaranteed for each value to be unique but the probability of uniqueness is extremely high.
Here is some code for a fairly good random 16-character string generator:
$random_bytes = mcrypt_create_iv(12, MCRYPT_DEV_URANDOM);
$string = base64_encode($random_bytes);
The string will have alphanumeric characters and / and +. For a hexadecimal string you can use this:
$random_bytes = mcrypt_create_iv(8, MCRYPT_DEV_URANDOM);
$string = bin2hex($random_bytes);
However, as you can see the first one is better because it has more bytes and therefore less chance of getting a collision.
Alternatively, you could use uniqid('', true) - a pretty good function for unique ID generation combining microtime and a pseudo random number generator. However, it's longer than 16 characters but you might be able to get rid of the dot and pack the data in some more efficient way.