Generar un id único


Soy estudiante en la universidad y nuestra tarea es crear un motor de búsqueda. Estoy teniendo dificultades para generar un id único para asignar a cada url cuando se agrega a la frontera. He intentado usar el algoritmo de hash SHA-256, así como Guid. Aquí está el código que usé para implementar el guid:

public string generateID(string url_add)
{
    long i = 1;

    foreach (byte b in Guid.NewGuid().ToByteArray())
    {
        i *= ((int)b + 1);
    }

    string number = String.Format("{0:d9}", (DateTime.Now.Ticks / 10) % 1000000000);

    return number;
}
Author: Mat, 2012-07-03

7 answers

¿Por qué no usar toString?

public string generateID()
{
    return Guid.NewGuid().ToString("N");
}

Si desea que se base en una URL, simplemente puede hacer lo siguiente:

public string generateID(string sourceUrl)
{
    return string.Format("{0}_{1:N}", sourceUrl, Guid.NewGuid());
}

Si desea ocultar la URL, podría usar algún tipo de SHA1 en sourceURL, pero no estoy seguro de lo que eso podría lograr.

 70
Author: Jaime Torres,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-15 13:48:12

¿Por qué no usar GUID?

Guid guid = Guid.NewGuid();
string str = guid.ToString();
 21
Author: abatishchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-03 14:34:54

Aquí hay un' YouTube-video-id 'como generador de id, por ejemplo, "UcBKmq2XE5a"

StringBuilder builder = new StringBuilder();
Enumerable
   .Range(65, 26)
    .Select(e => ((char)e).ToString())
    .Concat(Enumerable.Range(97, 26).Select(e => ((char)e).ToString()))
    .Concat(Enumerable.Range(0, 10).Select(e => e.ToString()))
    .OrderBy(e => Guid.NewGuid())
    .Take(11)
    .ToList().ForEach(e => builder.Append(e));
string id = builder.ToString();

Crea id aleatorios de tamaño 11 caracteres. También puede aumentar / disminuir eso, simplemente cambie el parámetro del método Take.

0,001% de duplicados en 100 millones.

 4
Author: Ashraf Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-07 00:27:43

Si desea utilizar sha - 256 (guid sería más rápido) entonces tendría que hacer algo como

SHA256 shaAlgorithm = new SHA256Managed();
byte[] shaDigest = shaAlgorithm.ComputeHash(ASCIIEncoding.ASCII.GetBytes(url));
return BitConverter.ToString(shaDigest);

Por supuesto, no tiene que ascii y también puede ser cualquier otro tipo de algoritmo de hash

 3
Author: daz-fuller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-03 14:45:35

¿Por qué no podemos hacer un id único como se muestra a continuación?

Podemos usar DateTime.Ahora.Garrapatas y Guid.NewGuid().toString () para combinar y crear un id único.

Como la Fecha y hora.Ahora.Se añade Ticks, podemos averiguar la Fecha y Hora en segundos a la que se crea el id único.

Por favor, consulte el código.

var ticks = DateTime.Now.Ticks;
var guid = Guid.NewGuid().ToString();
var uniqueSessionId = ticks.ToString() +'-'+ guid; //guid created by combining ticks and guid

var datetime = new DateTime(ticks);//for checking purpose
var datetimenow = DateTime.Now;    //both these date times are different.

Incluso podemos tomar la parte de ticks en id único y verificar la fecha y hora más tarde para referencia futura.

 2
Author: Jineesh Uvantavida,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-30 07:54:38

Esta pregunta parece ser respondida, sin embargo, para completar, agregaría otro enfoque.

Puede usar un generador de números de identificación único que se basa en el generador de id de Twitter Snowflake. La implementación de C# se puede encontrar aquí.

var id64Generator = new Id64Generator();

// ...

public string generateID(string sourceUrl)
{
    return string.Format("{0}_{1}", sourceUrl, id64Generator.GenerateId());
}

Tenga en cuenta que una de las características muy buenas de ese enfoque es la posibilidad de tener múltiples generadores en nodos independientes (probablemente algo útil para un motor de búsqueda) generando tiempo real, globalmente único identificador.

// node 0
var id64Generator = new Id64Generator(0);

// node 1
var id64Generator = new Id64Generator(1);

// ... node 10
var id64Generator = new Id64Generator(10);
 1
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-18 09:21:32

Prueba esto.

string a = DateTime.Now.Month.ToString() + 
            DateTime.Now.Day.ToString() +
            DateTime.Now.Year.ToString() +
            DateTime.Now.Hour.ToString() +
            DateTime.Now.Minute.ToString() +
            DateTime.Now.Second.ToString() +
            DateTime.Now.Millisecond.ToString();
 -4
Author: Dheo Agbuya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-05 09:36:52