Pregunta

Hola necesito generar 9 dígitos de un número de cuenta único.Aquí está mi pseudocódigo:

function generateAccNo()

    generate an account number between 100,000,000 and 999,999,999

    if the account number already exists in the DB 
        call generateAccNo()    /* recursive call */
    else
        return new accout number
    end if

end function

La función parece estar funcionando bien, sin embargo, estoy un poco preocupado acerca de la llamada recursiva.

Se esta causa alguna pérdida de memoria (5 de PHP en apache)?

Es esta una forma aceptable para hacer frente a este problema?

Gracias por tu aporte.

¿Fue útil?

Solución

Te das cuenta de esto muy bien podría causar un desbordamiento de pila, ¿verdad?Como el número de customesr aumenta, la probabilidad de no encontrar un aceptable número de cuenta aumenta.

También, ¿por qué no puede hacer secuencial de los números de cuenta y sólo aumenta en uno cada vez?Con este enfoque, sólo tendría que leer el max id actualmente en la base de datos y sólo incrementa.

Siento ser tan directo, pero su solución es una terrible manera de abordar el problema.Lo voy a usar toneladas de memoria (como la pila posiblemente crece infinitamente) y se hace de toneladas de costosas llamadas a la base de datos.

Usted realmente debe considerar algún otro enfoque:
Recomiendo encarecidamente que sólo incrementar el número de cliente cada vez que se crea un cliente.De hecho, si configuras tu db correctamente (con incremento automático en la columna id), usted no tendrá que especificar el id.El identificador será establecido para siempre que usted insertar un nuevo cliente.

Otros consejos

Yo realmente no creo que se llegue a la recursión vsbucle, ambos son propensos a problemas como el conjunto de datos crece y si la generación de números aleatorios no se implementa correctamente.Dos ideas vienen a la mente:

.GUID

Si realmente única identificación es requerida con tan poco esfuerzo como sea posible, considere la posibilidad de un GUID, tu DB más probable es que sea capaz de asignar para usted en insertar, si no crear uno en el código.Está garantizado para ser únicos, aunque no es muy amigable para el usuario.Sin embargo, en combinación con un secuencial de AccountRecordId generado por la base de datos de insertar usted tendría una buena combinación

.Clave Compuesta:Al Azar + Secuencial

Una manera de abordar todas las necesidades, aunque en la superficie se siente un poco desacoplados, es para crear un compuesto número de cuenta de un proceso secuencial de db clave de 5 dígitos (o más) y, a continuación, otro de 5 dígitos de la aleatoriedad.Si el número aleatorio se ha duplicado no importa como la secuencia de id se garantiza la unicidad de la totalidad del número de cuenta

No hay necesidad de utilizar una llamada recursiva aquí.Ejecutar un bucle while en la función de las pruebas en contra de los no-existencia como el condicional, por ejemplo,

function generateAccNo()

    generate an account number between 100,000,000 and 999,999,999

    while ( the account number already exists in the DB ) {
         generate new account number;
    }
    return new account number

end function

Al azar se generan, y la prueba es un sub-óptimo de enfoque a la generación de un número de cuenta único, sin embargo, si este código es para otra cosa más que un juguete.

Parece bien, pero creo que necesita algún tipo de die condición, ¿cuántas veces vas a dejar que este se ejecute antes de que te rindas?

Sé que esto parece poco probable que con el enorme rango de número, pero algo podría salir mal, que solo te deja volver a la llamada anterior, que se llame a sí mismo de nuevo, ad nauseum.

La generación de números de cuenta de forma secuencial es un riesgo de seguridad - usted debe encontrar algún otro algoritmo para hacerlo.

Alternativamente, usted puede mantener una tabla separada que contiene un búfer de genera, conocido por ser un número de cuenta único.Esta tabla debe tener una auto-incremento de id entero.Cuando usted quiere un número de cuenta, simplemente tire el registro con el más bajo índice en el búfer y se quite de esa tabla.Tienen algún tipo de proceso que se ejecuta regularmente que repone el búfer y se asegura de que tiene la capacidad de >> uso normal.La ventaja es que la cantidad de tiempo experimentado por el usuario final dedicado a la creación de un número de cuenta será esencialmente constante.

También, debo señalar que la carga de procesamiento o riesgos de repetición o iteración, el verdadero problema es el determinismo y la sobrecarga de la repetición de consultas de base de datos.Me gusta TheZenker la solución de azar + secuencial.Garantizados para generar un identificador único sin una carga de trabajo innecesaria.

Usted no necesita usar la recursividad aquí.Un simple bucle sería igual de rápido y consume menos espacio en la pila.

Usted puede ponerlo en un bucle while:

function generateAccNo()

    while (true) {    

      generate an account number between 100,000,000 and 999,999,999

      if the account number already exists in the DB 
          /* do nothing */
      else
          return new accout number
      end if
    }

end function

Por qué no:

lock_db
do
    account_num <= generate number
while account_num in db

put row with account_num in db

unlock_db

¿Por qué no tener la base de datos de manejar esto?EN SQL Server, puede hacer que una columna de identidad que comienza a 100000000.O usted podría utilizar sql en cualquier db que tiene.Acaba de obtener el máximo id de más de 1.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top