2010-10-07 21 views

Respuesta

6

La cantidad de información que un entero de PHP puede almacenar es limitada. La cantidad de información que puede almacenar en una cadena no es (al menos si la cadena no es irracionalmente larga)

Por lo tanto, necesitaría comprimir la cadena de longitud arbitraria en un entero de longitud no arbitraria. Esto es imposible sin pérdida de datos.

Puede usar un algoritmo hash, pero los algoritmos hashing siempre pueden tener colisiones. Especialmente si quiere unir una cadena a un número entero, la probabilidad de colisión es bastante alta: los enteros pueden almacenar muy pocos datos.

Por lo tanto, deberá seguir con el correo electrónico o usar un campo entero de incremento automático.

+0

puede explicar mejor su respuesta, especialmente el último párrafo y gracias – jspeshu

+0

buen razonamiento, debo decir, pero ¿puedo @ al menos encontrar una función que hará esto, p. tengo un campo, es decir, un correo electrónico que es VARCHAR (40) y dado que estos campos son únicos para todos los valores en lugar de usar un hash para evitar la colusión, agregaré un valor digamos XXXX para que su longitud == 40 siga siendo única, entonces ¿cómo puedo tener un int único de este – jspeshu

+2

bien. Todavía no creo que encuentres esa función: una cadena de 40 caracteres puede almacenarse en 40 bytes (si es ascii, unicode tomará * incluso más *). Un entero, por otro lado, solo tiene 8 bytes (y eso solo en una máquina de 64 bits). Por lo tanto, todavía tendría que almacenar 40 bytes en 8 bytes ... – NikiC

4

Pruebe la función binhex

desde el sitio anterior:

<?php 
$str = "Hello world!"; 
echo bin2hex($str) . "<br />"; 
echo pack("H*",bin2hex($str)) . "<br />"; 
?> 

salidas

48656c6c6f20776f726c6421 
Hello world! 
+0

puede generar un int único ahora es ver que "48656c6c6f20776f726c6421" un hexágono o menos – jspeshu

+0

depende de lo grande del int es sin embargo - que tiene un valor int 5216694956355254127 –

2

¿Por qué no tener un campo de ID de incremento automático en la base de datos?

+0

no tengo i db Estoy leyendo los datos del servidor LDAP y el único campo único es su dirección de correo electrónico – jspeshu

+2

+1 que es el enfoque correcto. sin magia de cuerdas – NikiC

+0

Realmente no necesita una base de datos para este enfoque, supongo que podría tener un incremento de archivo de texto para cada categoría de incrementos de nombre de archivo. – Vass

0

Si los correos electrónicos son en texto original, puede usar PHP ord function para generar un número entero único, ¡pero será un número muy grande!

El enfoque sería trabajar a través de la dirección de correo electrónico un carácter a la vez, llamando ord para cada uno de ellos. La función ord devuelve un entero expresando de manera única el valor del personaje. Puede rellenar cada uno de estos números con ceros y luego usar la concatenación de cadenas para conectarlos entre sí.

Considera la posibilidad de "abc".

ord("a"); 
>> 97 

ord("b"); 
>> 98 

ord("c"); 
>> 99 

cojín de estos números con un 0, y que tienen un número único para él, es decir: 970980990.

Espero que ayude!

+0

¿qué hay de la limitación de longitud, por ejemplo,? ¿Qué tal este correo electrónico "[email protected]" hay un int int para esto? No creo que así b/se php tiene una constante llamada PHP_MAX_INT o algo así. – jspeshu

+0

Sí, ese será el problema a superar. Como todos dicen, esta no es la manera correcta de hacerlo, solo quería resaltar un enfoque en caso de que eso ayude. – adamnfish

-1

¿Por qué no crear su propia tabla asociativa localmente que enlazará los correos electrónicos con enteros únicos?

lo tanto, el flujo de trabajo estaría en la línea de:

1 get the record from the ldap server. 
2 check it locally if it has already an int assigned. 
2.1 if yes use that int. 
2.2 if no, generate an associative row in the table locally. 
3 do your things with the unique ids. 

¿Tiene esto sentido?

+0

lo siento pero no entendí que ... – jspeshu

+0

La única manera en que puede mantener una asociación entre sus correos electrónicos y una lista de enteros es tener una capa persistente (una base de datos, por ejemplo) que funcionará como un correlacionador entre sus correos electrónicos y los números. Así que cree su tabla o archivo de base de datos localmente y almacene los datos de esa manera: [email protected] = 1001, [email protected] = 1002, etc. – Slavic

+0

eso es lo que quiero evitar y ¿qué me lleva a esta pregunta? pero gracias, creo que este chico @nikic lo entendió – jspeshu

-1

Se puede utilizar esta función:

function stringToInteger($string) { 
    $output = ''; 
    for ($i = 0; $i < strlen($string); $i++) { 
     $output .= (string) ord($string[$i]); 
    } 
    return (int) $output; 
} 

un poco feo, pero funciona :)

+1

puede querer convertir todas las direcciones de correo electrónico a minúsculas primero, para que siempre obtenga un valor de cadena consistente (strtolower) – Hightower

+0

el molde (int) no es correcto, ya que siempre devolverá el valor máximo int para cadenas largas – Rajesh

1

Este código genera el número de 64 bits que se puede utilizar, ya que o como Bigint/parecidos de tipo de datos para bases de datos como MySQL, etc.

function get64BitNumber($str) 
{ 
    return gmp_strval(gmp_init(substr(md5($str), 0, 16), 16), 10); 
} 

echo get64BitNumber('Hello World!'); // 17079728445181560374 
echo get64BitNumber('Hello World#'); // 2208921763183434891 
echo get64BitNumber('http://waqaralamgir.tk/'); // 12007604953204508983 
echo get64BitNumber('12345678910'); // 4841164765122470932 
Cuestiones relacionadas