2012-09-24 22 views
7

Necesito generar una ID ÚNICA (int solamente) de una cadena alfanumérica.Generar ID único a partir de la cadena alfanumérica

p. Ej. Tengo identificación de seguridad = 'ABC123DEF' Debería poder generar una identificación única (int solamente) de "identificación de seguridad" para que la identificación única sea siempre constante.

p. Ej. ID de seguridad: ABC123DEF ID int: 9463456892

Para que pueda almacenar la ID int en la base de datos y remitir la identificación de seguridad de ID int en cualquier momento.

Algunos ejemplos: PBG_CD_20120214_.2 | 201202-CMG188963_T | PBG_TD_20120306_.0001 3 ejemplos: -PIPE separado

+0

Mire en hash. – SLaks

+0

Eres muy específico, debe ser un int, pero defina int? El número que pones es demasiado grande para una int tradicional que se refiere a 32 bits generalmente, aunque cabe en un largo. ¿Cuáles son las limitaciones de espacio de la identificación numérica? –

+0

Hola Jimmy Puede ser largo int. Puede ser que debería ponerlo de esta manera. La ID generada debe estar en "Numberic (0 - 9)" – Anshul

Respuesta

1

Puede codificar cada carácter como un número de dos dígitos, 0-9 como los números mismos, 10-35 como A-Z.

Por ejemplo, sería 9AC8 09 10 12 08 = 09101208.

EDIT: Para un número pequeño que podría utilizar este método (con psuedocode al estilo de Java):

char[] availableChars = ['A', 'B', ... , '0', ... '9', '-', '_', '.']; 
long hash = 0; 
long base = 1; 
for (char c in string.toCharArray()) 
    for (int key=0; key < availableChars.length; key++) 
     if (availableChars[key] != c) 
      continue; 
     hash += base*key; 
     base = base*availableChars.length 

return hash; 
+0

Tengo una cadena alfanumérica: Me gusta "201202-CMG277440_T" – Anshul

+0

¿Existe un límite de tamaño de sus números? – redolent

+0

No - No Limite el tamaño del número. – Anshul

21

sólo tiene que utilizar el algoritmo hashing de Java. No es 100% único, sino que se puede utilizar como base y añadir algo a garantizar la unicidad en un conjunto de colisión mucho menor:

public static int hash(String s) { 
    int h = 0; 
    for (int i = 0; i < s.length(); i++) { 
     h = 31 * h + s.charAt(i); 
    } 
    return h; 
} 

Con el fin de evitar la colisión del 100%, es necesario un número primo que es más grande que el mayor diferencia entre tus personajes. Por lo tanto, para ASCII de 7 bits, necesita algo superior a 128. Por lo tanto, en lugar de 31, use 131 (el siguiente número primo después de 128). La parte que no he revisado es si el hash generado terminará siendo más grande que el tamaño de tus entradas largas. Pero puede tomarlo desde allí ...

+0

. Creo que esto va a funcionar. Déjame intentarlo. Muchas gracias. – Anshul

+3

No olvides aprobar la respuesta en beneficio de la comunidad si funciona – mprivat

Cuestiones relacionadas