Ok, PHP no es el mejor lenguaje para tratar con enteros arbitrariamente grandes, considerando que solo admite nativamente enteros de 32 bits. Lo que intento hacer es crear una clase que pueda representar un número binario arbitrariamente grande y poder realizar operaciones aritméticas simples en dos de ellos (agregar/restar/multiplicar/dividir).Aritmética con enteros arbitrariamente grandes en PHP
Mi objetivo es tratar con enteros de 128 bits.
Hay un par de enfoques que estoy viendo y problemas que veo con ellos. Cualquier comentario o comentario sobre lo que elegiría y cómo podría hacerlo sería muy apreciado.
Método n.º 1: Crea una clase entera de 128 bits que almacena su número entero internamente como cuatro enteros de 32 bits. El único problema con este enfoque es que no estoy seguro de cómo manejar problemas de desbordamiento/subdesbordamiento al manipular trozos individuales de los dos operandos.
Método n.º 2: Utilice la extensión bcmath, ya que parece algo para lo que fue diseñado. Mi única preocupación al tomar este enfoque es la configuración de la escala de la extensión bcmath, porque no puede haber ningún error de redondeo en mis enteros de 128 bits; deben ser precisos. También me preocupa poder convertir finalmente el resultado de las funciones bcmath en una cadena binaria (que más adelante necesitaré introducir en algunas funciones de cifrado de mcrypt).
Método n.º 3: Almacene los números como cadenas binarias (probablemente LSB primero). En teoría, debería poder almacenar enteros de cualquier tamaño arbitrario de esta manera. Todo lo que tendría que hacer es escribir las cuatro funciones aritméticas básicas para realizar add/sub/mult/div en dos cadenas binarias y producir un resultado de cadena binaria. Este es exactamente el formato que necesito entregar a mcrypt, así que eso es un plus añadido. Este es el enfoque que creo que es el más prometedor en este momento, pero el punto clave que tengo es que PHP no me ofrece ninguna forma de manipular los bits individuales (que yo sepa). Creo que tendré que dividirlo en trozos del tamaño de un byte (sin juego de palabras), momento en el cual se aplican mis preguntas sobre el manejo del desbordamiento/desbordamiento del Método n. ° 1.
¡Gracias, parece una extensión muy elegante! –
Si ejecuta PHP x64 en Windows, no tiene suerte con la extensión GMP.Parece que el mantenedor de la biblioteca GMP no lo ha portado a Windows x64, aunque está disponible para Linux x64. Para solucionar esto, puede utilizar MySQL si está utilizando esa plataforma de base de datos en su proyecto. MySQL admite enteros de 64 bits y tiene toneladas de operadores booleanos y una función de conversión de base. Escribí una clase simple para facilitar esto en mi proyecto. –