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 de la difficulté à générer un identifiant unique à atsortingbuer à chaque URL lorsqu’elle est ajoutée à la frontière. J’ai essayé d’utiliser l’algorithme de hachage SHA-256 ainsi que le Guid. Voici le code que j’ai utilisé pour implémenter le guid:

public ssortingng generateID(ssortingng url_add) { long i = 1; foreach (byte b in Guid.NewGuid().ToByteArray()) { i *= ((int)b + 1); } ssortingng number = Ssortingng.Format("{0:d9}", (DateTime.Now.Ticks / 10) % 1000000000); return number; } 

Pourquoi ne pas simplement utiliser ToSsortingng?

 public ssortingng generateID() { return Guid.NewGuid().ToSsortingng("N"); } 

Si vous souhaitez qu’il soit basé sur une URL, vous pouvez simplement faire ce qui suit:

 public ssortingng generateID(ssortingng sourceUrl) { return ssortingng.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 peut apporter.

Pourquoi ne pas utiliser le GUID ?

 Guid guid = Guid.NewGuid(); ssortingng str = guid.ToSsortingng(); 

Voici un identifiant ‘YouTube-video-id’ comme par exemple “UcBKmq2XE5a”

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

Il crée des identifiants aléatoires de taille 11 caractères. Vous pouvez aussi augmenter / diminuer, modifiez simplement le paramètre de la méthode Take.

0,001% des doublons sur 100 millions.

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

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

Bien sûr, il n’a pas à ascii et il peut aussi s’agir de n’importe quel autre algorithme de hachage

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

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

Au fur et à mesure que DateTime.Now.Ticks est ajouté, nous pouvons trouver la date et l’heure en secondes auxquelles l’identifiant unique est créé.

S’il vous plaît voir le code.

 var ticks = DateTime.Now.Ticks; var guid = Guid.NewGuid().ToSsortingng(); var uniqueSessionId = ticks.ToSsortingng() +'-'+ 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 part des ticks dans l’identifiant unique et vérifier la date et l’heure plus tard pour référence future.

Cette question semble avoir une réponse, mais pour être complet, j’appendais une autre approche.

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

 var id64Generator = new Id64Generator(); // ... public ssortingng generateID(ssortingng sourceUrl) { return ssortingng.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 globalement 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); 

Essaye ça.

 ssortingng a = DateTime.Now.Month.ToSsortingng() + DateTime.Now.Day.ToSsortingng() + DateTime.Now.Year.ToSsortingng() + DateTime.Now.Hour.ToSsortingng() + DateTime.Now.Minute.ToSsortingng() + DateTime.Now.Second.ToSsortingng() + DateTime.Now.Millisecond.ToSsortingng();