obtener string unico para un valor

133 views
Skip to first unread message

cesar barcia

unread,
Jul 6, 2017, 11:32:03 AM7/6/17
to Grupo PHP Argentina
Hola gente un gusto en saludarlos!

estoy por crear en una tabla 10 millones de registros, para estoy voy hacer un loop y dentro la sql.. (les voy comentando asi me dicen si ven algo que no sea posible)

lo importante de cada uno de los 10 millones de registros es que tengan un numero unico, esto no seria mas que el id autoincrementable pero en otro campo de esta tabla quiero crear un string unico e irrepetible para este ID. Si utilizo la funcion sha1($id) esto me va crear un string unico para el id 01 otro para el id 02 otro para el id 5.895.258 verdad? nunca me va crear un codigo sha1 igual siempre que el parametro que le ingrese a la funcion sea diferente? en mi caso el parametro siempre va hacer el id del registro.

Gracias desde ya!

pd: con mysql no voy a tener problemas para generar esa cantidad de 10 millones de registros?

Tordek

unread,
Jul 6, 2017, 3:48:34 PM7/6/17
to php...@googlegroups.com
"Probablemente" no. Es decir, en sha1 por su naturaleza existen
colisiones (Es decir... a sha1 le podés dar cadenas de cualquier
tamaño; pero siempre te develve una de una longitud fija; la cantidad
de cadenas de entrada es infinitamente más grande que las de salida,
entonces hay cadenas diferentes que dan el mismo hash), aunque dudo
que entre 1 y 10^10 tengas alguna (igual debería ser trivial de
testear, no es ni lento ni ocupa mucho espacio).

Habiendo dicho eso, suena a horrible idea. ¿Para qué querés hacerlo
así? Es decir, ¿Cómo querés usar esos números? Si los querés usar como
ID "secreto", cualquiera puede hacer lo mismo e identificarte los IDs.
Lo típico es usar UUID, generados al azar. Son números de 128b, así
que la probabilidad de una colisión es igual mínima, pero ponés en la
tabla la limitación de que esa columna debe ser única y listo.

10MM de registros no debería ser mucho para Mysql, no.
> --
> Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP
> Argentina" de Grupos de Google.
> Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes,
> envía un correo electrónico a php-arg+u...@googlegroups.com.
> Para publicar en este grupo, envía un correo electrónico a
> php...@googlegroups.com.
> Visita este grupo en https://groups.google.com/group/php-arg.
> Para acceder a más opciones, visita https://groups.google.com/d/optout.

cesar barcia

unread,
Jul 10, 2017, 12:56:33 PM7/10/17
to Grupo PHP Argentina

Hola Tordek

Te agradezco mucho tu respuesta, te comento estoy haciendo un sorteo online entonces quiero generar primero los 10mm de numero que 
saldran a la venta y que mas alla que el registro tenga un id unico tenga otro valor unico para que cuando una persona compre hacer esa comprobación que el id coincide con ese otro valor unico que le genere previamente. como para confirmar que es un registro que cree yo en la base de datos nada mas... 

1)La función que me comentas vos es la uniqid de php?  

2) No tengo definido como va hacer el numero identificatorio para el billete del sorteo,pero viendo esa funcion uniqid con more_entropy en true seria muy raro tener una duplicidad en lo que retorna uniqid verdad? 

3) En mysql podria establecer el campo que reciba el valor de uniqid como unico? osea ejecutar esta sql "ALTER TABLE `numeros` ADD UNIQUE(`nro`);" 


No he definido pero quizar sea mejor no crear directamente los 10mm de registro y que se vallan insertando en la tabla a medida que la gente valla comprando. la plataforma de pago va hacer paypal y pensaba hacer este insert automatipo con paypal IPN 

Desde ya muchas gracias!!

Tordek

unread,
Jul 10, 2017, 3:42:37 PM7/10/17
to php...@googlegroups.com
Hola, Cesar

1. No, no es uniqid; pero parece que php no tiene una función uuid nativa.
2. Como te dice la doc: no te garantiza unicidad (porque el clock
puede cambiar), ni es un número criptográficamente seguro.
3. Sí.

> tenga un id unico tenga otro valor unico para que cuando una persona compre hacer esa comprobación que el id coincide con ese otro valor unico que le genere previamente. como para confirmar que es un registro que cree yo en la base de datos nada mas...

Ok, en ese caso lo que querés es más como una firma digital. En este
caso, tu idea original de sacar sha1(id) es potencialmente peligrosa
porque cualquiera puede ejecutar lo mismo y presentarte un voucher
falso, si sabe su id.

Si no te interesa que sea accesible de manera offline, la forma fácil
es simplemente generar un numero aleatorio (fijate la función
random_byte, que te genera secuencias de bytes criptograficamente
seguras; a eso lo convertís a hex con bin2hex y listo). (Como bonus,
podés marcar en la tabla que el premio ya fue retirado).

Si te interesa que sea posible verificar sin conexión, podés usar una
función de hash con una clave privada; por ejemplo hash_hmac: esta
función toma, además del string que hashea, una clave; así eliminás el
caso de que alguien pueda generar el mismo hash y falisificar el
codigo de verificacion (pero tenes un problema de que alguien puede
venir 2 veces con el mismo ticket).

Saludos!
Reply all
Reply to author
Forward
0 new messages