shortener personalizado hacer gratis google como bitly acortar acortadores acortador c# .net hash short-url

c# - personalizado - como hacer un bit ly



¿Cuál es la mejor manera de crear un hash corto, similar a lo que hace Url pequeño? (13)

Actualmente estoy usando hash MD5, pero me gustaría encontrar algo que cree un hash más corto que use solo [az] [AZ] [0-9]. Solo necesita tener entre 5 y 10 caracteres de longitud.

¿Hay algo por ahí que ya hace esto?

Actualizar:

Me gusta el hash CRC32. ¿Hay una manera limpia de calcularlo en .NET?

Actualización2:

Estoy usando la función CRC32 desde el enlace proporcionado por Joe. ¿Cómo puedo convertir el uInt en los caracteres definidos anteriormente?


¿Tu objetivo es crear un acortador de URL o crear una función hash?

Si tu objetivo es crear un acortador de URL, entonces no necesitas una función de hash. En ese caso, solo desea generar previamente una secuencia de números aleatorios criptográficamente seguros, y luego asignarle a cada url un número único de la secuencia.

Puedes hacer esto usando un código como:

using System.Security.Cryptography; const int numberOfNumbersNeeded = 100; const int numberOfBytesNeeded = 8; var randomGen = RandomNumberGenerator.Create(); for (int i = 0; i < numberOfNumbersNeeded; ++i) { var bytes = new Byte[numberOfBytesNeeded]; randomGen.GetBytes(bytes); }

Usar el generador de números criptográficos hará que sea muy difícil para las personas predecir las cadenas que generas, lo que supongo que es importante para ti.

Luego puedes convertir el número aleatorio de 8 bytes en una cadena usando los caracteres en tu alfabeto. Esto es básicamente un cambio de cálculo base (desde la base 256 hasta la base 62).


El objeto de cadena .NET tiene una función GetHashCode (). Devuelve un entero. Convierta en un hexágono y luego en una cadena de 8 caracteres de largo.

Al igual que:

string hashCode = String.Format("{0:X}", sourceString.GetHashCode());

Más sobre eso: http://msdn.microsoft.com/en-us/library/system.string.gethashcode.aspx

ACTUALIZACIÓN: agregó los comentarios del enlace de arriba a esta respuesta:

El comportamiento de GetHashCode depende de su implementación, que puede cambiar de una versión del tiempo de ejecución de lenguaje común a otra. Una razón por la que esto podría suceder es mejorar el rendimiento de GetHashCode.

Si dos objetos de cadena son iguales, el método GetHashCode devuelve valores idénticos. Sin embargo, no hay un valor único de código hash para cada valor de cadena único. Diferentes cadenas pueden devolver el mismo código hash.

Notas para las personas que llaman

El valor devuelto por GetHashCode depende de la plataforma . Difiere en las versiones de 32 bits y 64 bits de .NET Framework.


Hay un programa maravilloso pero antiguo llamado btoa que convierte binario a ASCII usando letras mayúsculas y minúsculas, dígitos y dos caracteres adicionales. También está la codificación MIME base64; la mayoría de los sistemas Linux probablemente tengan un programa llamado base64 o base64encode . Cualquiera de los dos le daría una cadena breve y legible de un CRC de 32 bits.


No creo que los servicios de acortamiento de URL usen hash, creo que solo tienen una cadena alfanumérica en ejecución que se incrementa con cada URL nueva y se almacena en una base de datos. Si realmente necesita usar una función hash, eche un vistazo a este enlace: algunas funciones hash También, un poco offtopic pero dependiendo de lo que esté trabajando en esto podría ser interesante: Artículo Coding Horror


No puede usar un hash corto ya que necesita un mapeo uno a uno desde la versión corta hasta el valor real. Para un hash corto, la probabilidad de una colisión sería demasiado alta. Los hashes normales y largos no serían muy fáciles de usar (y aunque la probabilidad de una colisión probablemente sería lo suficientemente pequeña entonces, todavía no se sentiría "bien" para mí).

TinyURL.com parece usar un número incrementado que se convierte en Base 36 (0-9, AZ).


Primero obtengo una lista de números aleatorios distintos. Luego selecciono cada char de la cadena base, anexo y regreso el resultado. Estoy seleccionando 5 caracteres, que equivalen a 6471002 permutaciones fuera de la base 62. La segunda parte es verificar contra db para ver si existe alguna, si no guarda una URL corta.

const string BaseUrlChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; private static string ShortUrl { get { const int numberOfCharsToSelect = 5; int maxNumber = BaseUrlChars.Length; var rnd = new Random(); var numList = new List<int>(); for (int i = 0; i < numberOfCharsToSelect; i++) numList.Add(rnd.Next(maxNumber)); return numList.Aggregate(string.Empty, (current, num) => current + BaseUrlChars.Substring(num, 1)); } }


Puede codificar su código hash md5 con base64 en lugar de hexadecimal, de esta forma obtendrá una URL más corta usando exactamente los caracteres [az] [AZ] [0-9].


Puede disminuir el número de caracteres del hash MD5 codificándolos como alfanuméricos. Cada carácter MD5 generalmente se representa como hexadecimal, por lo que hay 16 valores posibles. [a-zA-Z0-9] incluye 62 valores posibles, por lo que podría codificar cada valor tomando 4 valores de MD5.

EDITAR:

aquí hay una función que toma un número (4 dígitos hexadecimales de largo) y devuelve [0-9a-zA-Z]. Esto debería darle una idea de cómo implementarlo. Tenga en cuenta que puede haber algunos problemas con los tipos; No probé este código.

char num2char( unsigned int x ){ if( x < 26 ) return (char)(''a'' + (int)x); if( x < 52 ) return (char)(''A'' + (int)x - 26); if( x < 62 ) return (char)(''0'' + (int)x - 52); if( x == 62 ) return ''0''; if( x == 63 ) return ''1''; }


Puede tomar los primeros 5-10 caracteres alfanuméricos del hash MD5.


Puede usar CRC32, tiene 8 bytes de longitud y es similar a MD5. Los valores únicos se admitirán al agregar la marca de tiempo al valor real.

Entonces se verá como http://foo.bar/abcdefg12 .


Si está buscando una biblioteca que genere pequeños hashes únicos de inters, recomiendo altamente http://hashids.org/net/ . Lo uso en muchos proyectos y funciona fantásticamente. También puede especificar su propio conjunto de caracteres para hashes personalizados.


Si no te importa la fuerza criptográfica, cualquiera de las funciones de CRC servirá.

Wikipedia enumera una serie de diferentes funciones hash, incluida la duración del resultado. La conversión de su salida a [az] [AZ] [0-9] es trivial.


Simplemente tome un Base36 (no distingue entre mayúsculas y minúsculas) o Base64 de la ID de la entrada.

Entonces, digamos que quería usar Base36:

(ID - Base36)
1 - 1
2 - 2
3 - 3
10 A
11 - B
12 - C
...
10000 - 7PS
22000 - GZ4
34000 - Q8C
...
1000000 - LFLS
2345000 - 1E9EW
6000000 - 3KLMO

Podrías mantener estos aún más cortos si fuiste con base64 pero luego las URL serían sensibles a mayúsculas y minúsculas. ¡Puedes ver que todavía obtienes tu llave alfanumérica ordenada y bonita y con la garantía de que no habrá colisiones!