Statement.getGeneratedKeys
.)
Unique identifiers which are "published" in some way may need special treatment, since the identifier may need to be difficult to guess or forge. A typical example is the value of a cookie used as a session identifier - simply using a series of consecutive integers is generally unacceptable, since one user could easily impersonate another by altering the value of the cookie to some nearby integer.
UUID
class provides a simple means for generating
unique ids. The identifiers generated by UUID are actually universally
unique identifiers.
Example
import java.util.UUID; public class GenerateUUID { public static final void main(String... args){ //generate random UUIDs UUID idOne = UUID.randomUUID(); UUID idTwo = UUID.randomUUID(); log("UUID One: " + idOne); log("UUID Two: " + idTwo); } private static void log(Object object){ System.out.println( String.valueOf(object) ); } }
>java -cp . GenerateUUID UUID One: 067e6162-3b6f-4ae2-a171-2470b63dff00 UUID Two: 54947df8-0e9e-4471-a2f9-9af509fb5889
If Java 5 is not available, then there are other more laborious ways to generate unique ids (see below).
The following method uses SecureRandom
and MessageDigest
:
SecureRandom
(this may be a lengthy operation)SecureRandom
MessageDigest
of the random numberbyte[]
returned by the MessageDigest
into
some acceptable textual formMessageDigest
class is suitable for generating a "one-way
hash" of arbitrary data. (Note that hash values never uniquely identify
their source data, since different source data can produce the same hash
value. The value of hashCode
, for example, does not uniquely identify
its associated object.) A MessageDigest
takes any input, and produces
a String
which:
MessageDigest
is often used as a checksum, for verifying that
data has not been altered since its creation.
Example
import java.security.SecureRandom; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public final class GenerateId { public static void main (String... arguments) { try { //Initialize SecureRandom //This is a lengthy operation, to be done only upon //initialization of the application SecureRandom prng = SecureRandom.getInstance("SHA1PRNG"); //generate a random number String randomNum = Integer.valueOf(prng.nextInt()).toString(); //get its digest MessageDigest sha = MessageDigest.getInstance("SHA-1"); byte[] result = sha.digest(randomNum.getBytes()); System.out.println("Random number: " + randomNum); System.out.println("Message digest: " + hexEncode(result)); } catch (NoSuchAlgorithmException ex) { System.err.println(ex); } } /** * The byte[] returned by MessageDigest does not have a nice * textual representation, so some form of encoding is usually performed. * * This implementation follows the example of David Flanagan's book * "Java In A Nutshell", and converts a byte array into a String * of hex characters. * * Another popular alternative is to use a "Base64" encoding. */ static private String hexEncode(byte[] input){ StringBuilder result = new StringBuilder(); char[] digits = {'0', '1', '2', '3', '4','5','6','7','8','9','a','b','c','d','e','f'}; for (int idx = 0; idx < input.length; ++idx) { byte b = input[idx]; result.append(digits[ (b&0xf0) >> 4 ]); result.append(digits[ b&0x0f]); } return result.toString(); } }
>java -cp . GenerateId
Random number: -1103747470
Message digest: c8fff94ba996411079d7114e698b53bac8f7b037
java.rmi.server.UID
.
The Serializable
identifiers generated by this class are unique
on the host on which they are generated, provided that
UID
that is globally unique, simply pair
a UID
with an InetAddress
.
Example
import java.rmi.server.UID; public class UniqueId { /** * Build and display some UID objects. */ public static void main (String... arguments) { for (int idx=0; idx<10; ++idx){ UID userId = new UID(); System.out.println("User Id: " + userId); } } }
Example run:
User Id: 3179c3:ec6e28a7ef:-8000
User Id: 3179c3:ec6e28a7ef:-7fff
User Id: 3179c3:ec6e28a7ef:-7ffe
User Id: 3179c3:ec6e28a7ef:-7ffd
User Id: 3179c3:ec6e28a7ef:-7ffc
User Id: 3179c3:ec6e28a7ef:-7ffb
User Id: 3179c3:ec6e28a7ef:-7ffa
User Id: 3179c3:ec6e28a7ef:-7ff9
User Id: 3179c3:ec6e28a7ef:-7ff8
User Id: 3179c3:ec6e28a7ef:-7ff7
Clearly, these are not secure identifiers - knowing one, it's easy
to guess another.