Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-11-2015
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
Acortador de cadena alfanumérica (simil URL Shortener)

Hola gente de Club Delphi.

Les escribo para consultarle alguna idea/código para "acortar" una cadena alfanumérica en una cadena del mismo tipo pero de menor tamaño.
Concretamente, tengo una cadena de 28 caracteres y necesito generar una nueva cadena pero de 8 o 10 caracteres con las siguientes características:

- Debe contar con la menor cantidad de colisiones posibles. Es para generar un código unívoco.
- Debe poder ser reversible. Cod28 --> CODIFICA --> Cod8, Cod8 --> DECODIFICA --> Cod28.

He estado investigando un poco y encontré algoritmos hash como ADLER32, CRC32, etc que te generan cadenas cortas pero no se muy bien como se comporta en cuestión de colisiones.
Les agradecería si me pueden orientar sobre alguna forma de resolver esto.
Desde ya, muchas gracias.
Saludos.
Responder Con Cita
  #2  
Antiguo 05-11-2015
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No es que vaya a aportar algo pero diré una cosa: si es reversible entonces es seguro que no hay colisiones.

// Saludos
Responder Con Cita
  #3  
Antiguo 05-11-2015
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por roman Ver Mensaje
No es que vaya a aportar algo pero diré una cosa: si es reversible entonces es seguro que no hay colisiones.

// Saludos
Ay, si no fuese por los matemáticos... ¡en las cavernas andábamos todavía!
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 06-11-2015 a las 09:15:28.
Responder Con Cita
  #4  
Antiguo 05-11-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cuanta sabiduría veo por aquí
Responder Con Cita
  #5  
Antiguo 05-11-2015
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Ustedes sabrán disculpar el destello luminoso en sus monitores

// Saludos
Responder Con Cita
  #6  
Antiguo 05-11-2015
Avatar de mamcx
mamcx mamcx is online now
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Buscando en google con "hash collisions short string" parece que hay buen material.

Spoiler: Una funcion de hash moderna es suficientemente buena.

Lo de las colisiones es algo que te ha pasado con las funciones que usaste? Aqui hay un codigo que chequea colisiones:

https://stackoverflow.com/questions/...oid-collisions

Asi que puedes hacer la prueba...
__________________
El malabarista.
Responder Con Cita
  #7  
Antiguo 06-11-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
Ustedes sabrán disculpar el destello luminoso en sus monitores
// Saludos
Menos mal que tengo puesta las gafas de sol
Responder Con Cita
  #8  
Antiguo 06-11-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por agustibaldo Ver Mensaje
Hola gente de Club Delphi.
Les escribo para consultarle alguna idea/código para "acortar" una cadena alfanumérica en una cadena del mismo tipo pero de menor tamaño.
Concretamente, tengo una cadena de 28 caracteres y necesito generar una nueva cadena pero de 8 o 10 caracteres con las siguientes características:

- Debe contar con la menor cantidad de colisiones posibles. Es para generar un código unívoco.
- Debe poder ser reversible. Cod28 --> CODIFICA --> Cod8, Cod8 --> DECODIFICA --> Cod28.

Tal vez se me ha escapado algo (es posible con la edad), pero creo que estás mezclando cosas distintas. Totalmente distintas.

* Un "URL Shortener" se basa en que convierte una cadena de 30 caracteres en otra de 5 caracteres (por decir algo), pero usando una tabla auxiliar donde están ambas. De forma, que la forma de obtener "la cadena larga" es ir a la tabla auxiliar y buscar es registro con la pareja:
CADENA_CORTA = CADENA_LARGA.

* Otra cosa totalmente distinta es "codificar" una CADENA_LARGA de 30 caracteres y obtener una CADENA_CORTA de 5 CARACTERES, teniendo en cuenta además que:
a) Eso sea reversible
b) Que no existan colosiones.

No se si eso es posible, y se acerca más a la teoría de un compresor, que de un codificador.

Lo dicho, seguramente se me está escapando algo...

También hablas de un algoritmo de CRC (o similares de checksum). También es otra cosa.
Un algoritmo de CRC cumple alguna caracteristica de las que comentas, pero no todas. Con un CRC:
a) Puedes convertir una CADENA_LARGA (1234567890qwertyuiopadsfg) en una CADENA_CORTA (34253).
b) Pero a partir de la CADENA_CORTA (34253), nunca podrás obtener la CADENA_LARGA (1234567890qwertyuiopadsfg). ¿De otra forma para qué serviría tener la larga?


Un Saludo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 06-11-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Por otro lado lo que ha dicho Román. Estas dos premisas son excluyentes, por lógica:

- Debe contar con la menor cantidad de colisiones posibles. Es para generar un código unívoco.
- Debe poder ser reversible. Cod28 --> CODIFICA --> Cod8, Cod8 --> DECODIFICA --> Cod28.

Es decir, con una única posible colisión, el código ya no será reversible.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 06-11-2015
Avatar de mamcx
mamcx mamcx is online now
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Aunque si el rango de posibles valores es finito, y se puede calcular, es posible crear una tabla como dice Neftali.

Supongo que importa mas:

Cita:
Debe poder ser reversible. Cod28 --> CODIFICA --> Cod8, Cod8 --> DECODIFICA --> Cod28.
Asi que un algoritmo de compresion es la solucion.

Este es un ejemplo especializado para cadenas cortas:

https://ed-von-schleck.github.io/shoco/

Ahora, si como parece, esto es para generar IDs, y pa' rematar son ascendentes -sea que tengan letras o no, lo importante es que tenga un metodo calculable para "ascender al siguiente"- ? Pues la cosa se pone mucho mas facil aun.
__________________
El malabarista.
Responder Con Cita
  #11  
Antiguo 06-11-2015
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
Hola, ante todo agradezco sus respuestas y pido disculpas si mezclé conceptos en mi intento por explicar el problema que necesito resolver. No soy un experto en el tema.

Básicamente, el problema es que tengo una cadena de 28 caracteres que me identifica un proceso y debo convertirla (o comprimirla o codificarla) en otra cadena de menor longitud (8 o 10 caract. aprox.) que tiene que ser impresa en una etiqueta y posteriormente leída e ingresada manualmente por un usuario (sin posib. de utilizar cód. de barra). Imagínense un usuario con la etiqueta en la mano tratando de leer en un espacio reducido y tipeando 28 caracteres.

Por esta razón, les consultaba algún algoritmo en Delphi que simule lo que realiza un "acortador de URL's" para que a partir una dirección genera una nueva mas pequeña.
Investigando un poco antes de realizar esta consulta, encontré que existen funciones para realizar checksum como ADLER32 o CRC32 que acortan estas cadenas pero que (a mi entender) no son reversibles por lo tanto no puede utilizarse como clave única.

Tomando el comentario de Neftali sobre el principio de funcionamiento de los "acortadores de URL's", como puedo generar un código que identifique una entrada única en esta tabla auxiliar con el código de la nueva URL? Existe algún algoritmo para generar este código?
Pensando rápido se me ocurre, por ejemplo utilizando ADLER32, que a partir de una cadena generar el código y verificar que no existe ingresado en esta tabla auxiliar. Si existe, volver a aplicar el algoritmo sobre este código generado y volver a chequear que no exista. Este proceso se repetiría hasta tanto se sigan encontrando coincidencias y llevaríamos un contador de nivel para utilizar en la decodificación.
Para decodificar, en teoría, deberíamos aplicar el proceso inverso tantas veces como niveles hayamos registrado.
Lo estoy pensando a medida que escribo estas líneas. Voy a intentar implementarlo y les cuento.

Nuevamente les agradezco por su tiempo y si tienen alguna otra idea o forma, bienvenida!
Saludos.
Responder Con Cita
  #12  
Antiguo 06-11-2015
Avatar de mamcx
mamcx mamcx is online now
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Segun tu caso de uso, puedes reusar un acortador de URLS. Solo tienes que crear una tabla que diga HasId=FullId y eso es todo. Si generaste un HashId es porque tienes el FullId, asi que si pasar un valor y no lo encuentras, es porque obviamente nunca fue generado.
__________________
El malabarista.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
numeración alfanumérica y aleatoria Aprendiendo OOP 5 06-09-2011 19:34:25
Funcion para borrar la cadena que aparesca repetida dentro de otra cadena flystar Varios 1 02-07-2007 23:51:10
Funcion para buscar cadena dentro de otra cadena y el numero de veces flystar Varios 3 02-07-2007 22:48:08
crear una llave alfanumerica con un generador reina SQL 3 17-08-2005 19:49:44
Extraer números en una string alfanumérica Tonio Varios 4 23-10-2003 10:22:04


La franja horaria es GMT +2. Ahora son las 22:51:41.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi