web-dev-qa-db-fra.com

Générer un identifiant unique

Je suis étudiant à l'université et notre tâche est de créer un moteur de recherche. J'ai des difficultés à générer un identifiant unique à attribuer à chaque URL lorsqu'il est ajouté à la frontière. J'ai essayé d'utiliser l'algorithme de hachage SHA-256 ainsi que Guid. Voici le code que j'ai utilisé pour implémenter le 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;
}
54
strange_developer

Pourquoi ne pas simplement utiliser ToString?

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

Si vous souhaitez qu'il soit basé sur une URL, vous pouvez simplement procéder comme suit:

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

Si vous souhaitez masquer l'URL, vous pouvez utiliser une forme de SHA1 sur l'URL source, mais je ne suis pas sûr de ce que cela pourrait permettre.

82
Jaime Torres

Pourquoi ne pas utiliser GUID ?

Guid guid = Guid.NewGuid();
string str = guid.ToString();
24
abatishchev

Voici un identifiant de type YouTube-video-id, par exemple: "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();

Il crée des identifiants aléatoires de taille 11. Vous pouvez aussi augmenter/diminuer cela, il suffit de changer le paramètre de la méthode Take.

0,001% est dupliqué sur 100 millions.

11
Ashraf Ali

Si vous voulez utiliser sha-256 (guid serait plus rapide), vous devriez faire quelque chose comme:

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

Bien sûr, il n’a pas besoin d’être ascii et il peut s’agir de tout autre type d’algorithme de hachage

3
daz-fuller

Pourquoi ne pouvons-nous pas créer un identifiant unique comme ci-dessous.

Nous pouvons utiliser DateTime.Now.Ticks et Guid.NewGuid (). ToString () pour combiner ensemble et créer un identifiant unique.

Au fur et à mesure que DateTime.Now.Ticks est ajouté, nous pouvons connaître la date et l'heure en secondes auxquelles l'id unique est créé.

S'il vous plaît voir le code.

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.

Nous pouvons même prendre la partie des ticks dans un identifiant unique et vérifier la date et l'heure ultérieurement pour référence ultérieure.

3

On semble répondre à cette question, mais pour compléter, j’ajouterais une autre approche.

Vous pouvez utiliser un générateur de numéro d'identification unique basé sur le générateur id. Snowflake de Twitter. Une implémentation en C # peut être trouvée ici .

var id64Generator = new Id64Generator();

// ...

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

Notez que l’une des caractéristiques très intéressantes de cette approche est la possibilité d’avoir plusieurs générateurs sur des nœuds indépendants (probablement quelque chose d’utile pour un moteur de recherche) générant des identifiants uniques en temps réel.

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

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

// ... node 10
var id64Generator = new Id64Generator(10);
1
Tom