seticon - text field java
¿Cómo creo una identificación única en Java? (12)
Aquí está mi valor de dos centavos: Anteriormente implementé una clase IdFactory
que creaba ID en el formato [nombre de host] - [hora de inicio de la aplicación] - [hora actual] - [discriminador] . Esto garantizaba en gran medida que los ID eran únicos en todas las instancias de JVM a la vez que se mantenían legibles los ID (aunque bastante largos). Aquí está el código en caso de que sea de alguna utilidad:
public class IdFactoryImpl implements IdFactory {
private final String hostName;
private final long creationTimeMillis;
private long lastTimeMillis;
private long discriminator;
public IdFactoryImpl() throws UnknownHostException {
this.hostName = InetAddress.getLocalHost().getHostAddress();
this.creationTimeMillis = System.currentTimeMillis();
this.lastTimeMillis = creationTimeMillis;
}
public synchronized Serializable createId() {
String id;
long now = System.currentTimeMillis();
if (now == lastTimeMillis) {
++discriminator;
} else {
discriminator = 0;
}
// creationTimeMillis used to prevent multiple instances of the JVM
// running on the same host returning clashing IDs.
// The only way a clash could occur is if the applications started at
// exactly the same time.
id = String.format("%s-%d-%d-%d", hostName, creationTimeMillis, now, discriminator);
lastTimeMillis = now;
return id;
}
public static void main(String[] args) throws UnknownHostException {
IdFactory fact = new IdFactoryImpl();
for (int i=0; i<1000; ++i) {
System.err.println(fact.createId());
}
}
}
Esta pregunta ya tiene una respuesta aquí:
- Crear un GUID en Java 6 respuestas
Estoy buscando la mejor manera de crear una ID única como una cadena en Java.
Cualquier orientación apreciada, gracias.
Debo mencionar que estoy usando Java 5.
Crea un UUID .
String uniqueID = UUID.randomUUID().toString();
Esto agrega un poco más de aleatoriedad a la generación de UUID, pero asegura que cada ID generada tenga la misma longitud
import org.apache.commons.codec.digest.DigestUtils;
import java.util.UUID;
public String createSalt() {
String ts = String.valueOf(System.currentTimeMillis());
String rand = UUID.randomUUID().toString();
return DigestUtils.sha1Hex(ts + rand);
}
Hay tres formas de generar identificador único en java.
1) la clase UUID proporciona un medio simple para generar identificadores únicos.
UUID id = UUID.randomUUID();
System.out.println(id);
2) SecureRandom y MessageDigest
//initialization of the application
SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");
//generate a random number
String randomNum = new Integer(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: " + new String(result));
3) usando un java.rmi.server.UID
UID userId = new UID();
System.out.println("userId: " + userId);
Java - Generar ID único
UUID es la forma más rápida y sencilla de generar identificaciones únicas en Java.
import java.util.UUID;
public class UniqueIDTest {
public static void main(String[] args) {
UUID uniqueKey = UUID.randomUUID();
System.out.println (uniqueKey);
}
}
Los aperkins de IMHO proporcionaron una solución elegante porque la causa es nativa y usa menos código. Pero si necesita una identificación más corta, puede utilizar este enfoque para reducir la longitud de cadena generada:
// usage: GenerateShortUUID.next();
import java.util.UUID;
public class GenerateShortUUID() {
private GenerateShortUUID() { } // singleton
public static String next() {
UUID u = UUID.randomUUID();
return toIDString(u.getMostSignificantBits()) + toIDString(u.getLeastSignificantBits());
}
private static String toIDString(long i) {
char[] buf = new char[32];
int z = 64; // 1 << 6;
int cp = 32;
long b = z - 1;
do {
buf[--cp] = DIGITS66[(int)(i & b)];
i >>>= 6;
} while (i != 0);
return new String(buf, cp, (32-cp));
}
// array de 64+2 digitos
private final static char[] DIGITS66 = {
''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'', ''a'',''b'',''c'',''d'',''e'',''f'',''g'',''h'',''i'',''j'',''k'',''l'',''m'',''n'',''o'',''p'',''q'',''r'',''s'',''t'',''u'',''v'',''w'',''x'',''y'',''z'',
''A'',''B'',''C'',''D'',''E'',''F'',''G'',''H'',''I'',''J'',''K'',''L'',''M'',''N'',''O'',''P'',''Q'',''R'',''S'',''T'',''U'',''V'',''W'',''X'',''Y'',''Z'',
''-'',''.'',''_'',''~''
};
}
Método java.util.UUID
: toString ()
Podemos crear una ID única en java utilizando el UUID
y llamar al método como randomUUID()
en UUID
.
String uniqueID = UUID.randomUUID().toString();
Esto generará el uniqueID
aleatorio cuyo tipo de devolución será String
.
Si desea ID cortos, legibles para el ser humano, y solo necesita que sean únicos por ejecución JVM:
private static long idCounter = 0;
public static synchronized String createID()
{
return String.valueOf(idCounter++);
}
Editar: Alternativa sugerida en los comentarios: esto se basa en la "magia" bajo la cubierta para la seguridad del hilo, pero es más escalable e igual de segura:
private static AtomicLong idCounter = new AtomicLong();
public static String createID()
{
return String.valueOf(idCounter.getAndIncrement());
}
Identificación única con información de conteo
import java.util.concurrent.atomic.AtomicLong;
public class RandomIdUtils {
private static AtomicLong atomicCounter = new AtomicLong();
public static String createId() {
String currentCounter = String.valueOf(atomicCounter.getAndIncrement());
String uniqueId = UUID.randomUUID().toString();
return uniqueId + "-" + currentCounter;
}
}
String name,password;
public int idGen() {
int id = this.name.hashCode() + this.password.hashCode();
int length = String.valueOf(id).length();
int Max_Length = 5;
if(String.valueOf(id).length()>Max_Length)
{
id = (int) (id /Math.pow(10.0,length - Max_Length ));
}
return id;
}
enter code here
Programa para generar identificaciones únicas
class Test {
public static void main(String arg[]) {
String s = "";
double d;
for (int i = 1; i <= 16; i++) {
d = Math.random() * 10;
s = s + ((int)d);
if (i % 4 == 0 && i != 16) {
s = s + "-";
}
}
System.out.println(s);
}
}
Salida:
7954-7605-1827-4795
1991-4912-4912-3008