off topic: php - acortar una cadena

Aldrin Martoq amartoq en dcc.uchile.cl
Jue Ene 20 02:27:11 CLST 2011


On Jan 20, 2011, at 1:12 AM, Miguel Oyarzo O. wrote:
> Investigue y todas las funciones q pille (hasta codificacion eb base por alli 256) y todas fallan con mi numero de 21 digitos. Es muy grande para tratarlo facilmente en PHP.

Un número de 21 dígitos es muy grande para PHP (32bits == 2147483648 ~=  9 dígitos). Tienes que usar una biblioteca para números grandes.

Como dijo Juan C. , con base 126 alcanzas a cubrir en 10 caracteres un número de 21 dígitos decimal. Si tu aplicación soporta un "string binario" no hay problema; de lo contrario, con 126 símbolos no puedes usar caracteres legibles en ASCII el cual tiene apenas 95 caracteres imprimibles.


Programar algo que traspase de una base X a otra es algo trivial (estoy cachando que lo podrían usar como el fizzbuzz).

Acá una implementación en python (que sí soporta números grandes), es penca la implementación pero funciona con base 92. Si puedes poner binarios, agranda el string CHARS con los caracteres extras, por ejemplo el signo del euro, etc... ojo que debes editar el archivo en ISO8859-1 o latín-1 o similar, si usas un editor UTF-8 tal vez repitas algún símbolo de la base.

En realidad, deberías generar programaticamente tus símbolos... eso.


--- ini ----------

#!/usr/bin/env python
# coding: latin-1

CHARS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-=,.<>:;[]{}\|/?~ ";
BASE=len(CHARS)
print "BASE ES: %d" % (BASE)

def encode(num, base = BASE):
  out = ""
  while num > 0:
    mod = num % base
    num = num / base
    out += CHARS[mod]
  return out[::-1]

def decode(str, base = BASE):
  num = 0
  ite = 0
  while len(str) > 0:
    chr = str[-1]
    str = str[:-1]
    ind = CHARS.find(chr)
    num += ind * (base ** ite)
    ite += 1
  return num


# probar
import random
for i in range(10):
  orig = random.randint(100000000000000000000, 999999999999999999999)
  codificado = encode(orig)
  decodificado = decode(codificado)
  print "%s %s => %s => %s" % (decodificado == orig, orig, codificado, decodificado)

---------- fin ---



Aldrin Martoq
http://aldrin.martoq.cl/







Más información sobre la lista de distribución Linux