¿Cuál es la mejor manera de hacer base36 aritmética en Perl?¿Cuál es la mejor manera de hacer aritmética base36 en Perl?
Para ser más específicos, que deben ser capaces de hacer lo siguiente:
Operar en números positivos N-dígitos en base 36 (por ejemplo, dígitos son 0-9 AZ)
N es finito, dicen 9
Proporcionar aritmética básica, al menos la siguiente 3:
de adición (A + B)
Resta (A-B)
división entera, por ejemplo, piso (A/B).
Estrictamente hablando, realmente no necesito una habilidad de conversión de base10 - los números serán el 100% del tiempo en base36. Así que estoy bastante bien si la solución NO implementa la conversión de base36 a base10 y viceversa.
No me importa mucho si la solución es de fuerza bruta "convertir a la base 10 y de vuelta" o convertir a binario, o algún enfoque más elegante "nativa" realizar operaciones Basen (como se indica arriba, hacia/desde la conversión de base10 no es un requisito). Mis únicas 3 consideraciones son:
Se adapta a las especificaciones mínimas por encima de
Es "estándar". Actualmente estamos usando un viejo módulo basado en la conversión de base10 hecho a mano que tiene errores y es una mierda.
Prefiero reemplazarlo con alguna solución de CPAN de uso común en lugar de volver a escribir mi propia bicicleta desde cero, pero soy perfectamente capaz de construirla si no existe una posibilidad estándar mejor.
Debe ser rápido (aunque no muy rápido). Algo que toma 1 segundo para resumir 2 números base36 de 9 dígitos es peor que cualquier cosa que pueda rodar por mi cuenta :)
P.S. Solo para proporcionar un contexto en caso de que las personas decidan resolver mi problema XY además de responder a la pregunta técnica anterior :)
Tenemos un árbol bastante grande (almacenado en DB como un grupo de bordes), y necesitamos para superponer el orden en un subconjunto de ese árbol. Las dimensiones de los árboles son grandes tanto en profundidad como en anchura. El árbol está MUY activamente actualizado (inserta y elimina y mueve ramas).
Esto se hace actualmente teniendo una segunda tabla con 3 columnas: parent_vertex, child_vertex, local_order
, donde local_order
es una cadena de 9 caracteres construida de A-Z0-9 (por ejemplo, número base 36).
consideraciones adicionales:
se requiere que el orden local es única por niño (y, obviamente, único para cada padre),
Cualquier completa reordenación de un padre es algo caro, y por lo tanto la implementación es intentar y asignar - para un padre con hijos X - los pedidos que están distribuidos de manera uniforme entre 0 y 36 ** 10-1, de modo que casi ningún inserto de árbol resulte en un reordenamiento completo.
Por cierto, en caso de que me dice " Pero puedes hacer esto fácilmente en SQL, ¿por qué estás preguntando esto como una pregunta de Perl? ", La respuesta es: ¡me encantaría una solución solo de SQL! Simplemente no creo que se pueda hacer en SQL puro con ningún grado de eficiencia, y la eficiencia es importante cuando se trata de SQL Server utilizado como recurso singleton por toda la empresa :( – DVK
Además, sé acerca de Math :: BaseCnv y Math :: BaseCalc - No sé cuán estable/rápido son, así que le pido a la comunidad SO que sean las mejores prácticas. No tenemos ninguna de estas instaladas, y la instalación de un nuevo módulo CPAN es un gran problema con Equipo de ingeniería de software que requiere una buena justificación comercial Y una señal de que el módulo es estable – DVK
Técnicamente "convertir a base 10 y volver" es lo mismo que convertir a binario - no es como internamente, la máquina convierte todos los enteros en cadenas de base 10 para realizar operaciones matemáticas y luego de vuelta. Base 10 es solo un concepto usado para mostrar números para mostrar, y nada más. – Ether