tipos reglas que programacion los identificadores identificador ejemplos constantes c# .net algorithm guid

c# - reglas - ¿Cuáles son las opciones para generar identificadores alfanuméricos fáciles de usar(como identificación comercial, SKU)?



tipos de identificadores (5)

Es posible que desee probar un algoritmo de hash CRC32. El CRC32 genera una cadena de 8 caracteres.

http://en.wikipedia.org/wiki/Cyclic_redundancy_check

http://textop.us/Hashing/CRC

Aquí están los requisitos:

Debe ser alfanumérico, 8-10 caracteres para que sea fácil de usar. Estos se almacenarán como claves únicas en la base de datos. Estoy utilizando Guids como claves principales, por lo que una opción para usar GUID para generar estos Ids únicos sería preferible.

Estoy pensando en las líneas de un convertidor base-n que toma un Guid y lo convierte en una cadena única de 8 caracteres.

Algoritmo corto y liviano preferido ya que se llamaría con bastante frecuencia.


Lo más simple que podría funcionar es un contador que se incrementa cada vez que se requiere un valor. Ocho dígitos (relleno de cero a la izquierda) le dan 100 millones de valores posibles de 00000000 a 99999999 (aunque puede intercalar espacios o guiones para la legibilidad humana, como en 000-000-00).

Si va a necesitar más de 100 millones de valores, puede aumentar la longitud o usar letras en posiciones alternativas. El uso de A0A0A0A0 a través de Z9Z9Z9Z9 le ofrece más de cuatro mil quinientos millones de valores posibles (4,569,760,000) disponibles. Es un código trivial de código tomar un entero largo y producir dicha codificación (mod 10 para el dígito más a la derecha, div por 10 y luego mod 26 para la letra más a la derecha, etc.) Si tiene memoria para grabar, la forma más rápida es convertir el contador a una matriz mod 260, y usar cada valor de mod 260 como un índice en una matriz de cadenas de dos caracteres ("A0", "A1", "A2", y así sucesivamente a través de "A9", " B0 "," B1 ", etc. a través de" Z9 ").

El problema con la base 36 (mencionado en otra respuesta) es que no solo debes preocuparte por la confusión del lector con caracteres similares (uno contra I, cero vs. O, dos contra Z, cinco contra S) sino también sobre combinaciones de letras adyacentes que puedan ser percibidas por los lectores como palabras o abreviaturas desagradables u obscenas.


Puede considerar la base 36. en que puede hacer letras y números. Considere eliminar I (ojo) y O (Oh) de su conjunto para que no se mezclen con 1 (uno) y 0 (cero). Algunas personas pueden quejarse también de 2 y Z.


Si está buscando "fácil de usar", puede intentar usar palabras enteras en lugar de simplemente hacer que sea corto / alfanumérico, por lo tanto, algo así como:

words = [s.strip().lower() for s in open(''/usr/share/dict/canadian-english'') if "''" not in s] mod = len(words) def main(script, guid): guid = hash(guid) print "+".join(words[(guid ** e) % mod] for e in (53, 61, 71)) if __name__ == "__main__": import sys main(*sys.argv)

Que produce resultados como:

oranjestad+compressing+wellspring padlock+discommoded+blazons pt+olenek+renews

Que es divertido De lo contrario, simplemente tomar los primeros 8-10 caracteres del guid o sha1 / md5 hash del guid es probablemente la mejor opción.


8 characters - perfectly random - 36^8 = 2,821,109,907,456 combinations 10 characters - perfectly random - 36^10 = 3,656,158,440,062,976 combinations GUID''s - statistically unique* - 2^128 = 340,000,000,000,000,000,000,000,000,000,000,000,000 combinations

* ¿Es un GUID único el 100% del tiempo? [desbordamiento de pila]

El problema con tu GUID -> conversión de caracteres; mientras que su GUID es estadísticamente único, tomando cualquier subconjunto disminuye la aleatoriedad y aumenta las posibilidades de colisiones. Ciertamente no desea crear SKU que no sean únicos.

Solución 1:

Crear SKU usando datos relevantes para el objeto y las reglas comerciales.

es decir, es probable que haya una pequeña combinación de atributos que hace que un objeto sea único (una clave natural) . Combine los elementos de la clave natural, codifíquelos y comprímelos para crear una SKU. A menudo, todo lo que necesita es un campo de fecha y hora (es decir, CreationDate) y algunas otras propiedades para lograrlo. Es probable que tengas muchos agujeros en la creación de sku, pero los sku son más relevantes para tus usuarios.

hipotéticamente

Wholesaler, product name, product version, sku Amazon, IPod Nano, 2.2, AMIPDNN22 BestBuy, Vaio, 3.2, BEVAIO32

Solución 2:

Un método que reserva un rango de números, y luego procede a liberarlos secuencialmente, y nunca devuelve el mismo número dos veces. Aún puede terminar con agujeros en el rango. Aunque es probable que no necesite generar suficientes sku para importar, asegúrese de que sus requisitos lo permitan.

Una implementación es tener una tabla de key en una base de datos que tenga un contador. El contador se incrementa en una transacción. Un punto importante es que en lugar de incrementar en 1, el método en el software toma un bloque. pseudo-c # -code es el siguiente.

-- what the key table may look like CREATE TABLE Keys(Name VARCHAR(10) primary key, NextID INT) INSERT INTO Keys Values(''sku'',1) // some elements of the class public static SkuKeyGenerator { private static syncObject = new object(); private static int nextID = 0; private static int maxID = 0; private const int amountToReserve = 100; public static int NextKey() { lock( syncObject ) { if( nextID == maxID ) { ReserveIds(); } return nextID++; } } private static void ReserveIds() { // pseudocode - in reality I''d do this with a stored procedure inside a transaction, // We reserve some predefined number of keys from Keys where Name = ''sku'' // need to run the select and update in the same transaction because this isn''t the only // method that can use this table. using( Transaction trans = new Transaction() ) // pseudocode. { int currentTableValue = db.Execute(trans, "SELECT NextID FROM Keys WHERE Name = ''sku''"); int newMaxID = currentTableValue + amountToReserve; db.Execute(trans, "UPDATE Keys SET NextID = @1 WHERE Name = ''sku''", newMaxID); trans.Commit(); nextID = currentTableValue; maxID = newMaxID; } }

La idea aquí es que reserve suficientes claves para que su código no vaya a menudo a la base de datos, ya que obtener el rango de clave es una operación costosa. Debe tener una buena idea del número de claves que necesita reservar para equilibrar la pérdida de clave (reinicio de la aplicación) versus las claves agotadoras demasiado rápido y volver a la base de datos. Esta sencilla implementación no tiene forma de reutilizar las claves perdidas.

Debido a que esta implementación depende de una base de datos y transacciones, puede tener aplicaciones que se ejecutan simultáneamente y todas generan claves únicas sin necesidad de ir a la base de datos con frecuencia.

Tenga en cuenta que lo anterior se basa libremente en la key table , página 222 de Patterns of Enterprise Application Architecture (Fowler) . El método se usa generalmente para generar claves primarias sin la necesidad de una columna de identidad de base de datos, pero puede ver cómo se puede adaptar para su propósito.