2016-09-08 4 views
0

Je souhaite prendre n'importe quel objet et obtenir un guid représentant cet objet. Je sais que cela implique beaucoup de choses. Je suis à la recherche d'une solution assez bonne pour les applications courantes.Object to GUID/UUID

Mon cas d'utilisation spécifique est pour la mise en cache, je veux savoir que l'objet utilisé pour créer la chose que je cache a déjà fait un dans le passé. Il y aurait 2 types d'objets différents. Chaque type contient uniquement des propriétés publiques et peut contenir une liste/ienumable.

En supposant que l'objet pourrait être sérialisable ma première idée était de sérialisation à JSON (via jsonserlizer native ou newtonsoft), puis prendre la chaîne JSON et convertir en une version UUID 5 comme détaillé dans un point essentiel ici How can I generate a GUID for a string?

Ma deuxième approche si elle n'est pas sérialisable (par exemple contenir un dictionnaire) serait d'utiliser la réflexion sur les propriétés publiques pour générer une chaîne unique et la convertir en uuid version 5.

Les deux approches utilisent la version uuid 5 pour prendre une chaîne à guid. Existe-t-il une classe C# éprouvée qui rend les uids 5 uids valides? L'essentiel semble bon, mais veulent être sûrs.

Je pensais faire de l'espace de noms C# et du nom de type l'espace de noms pour l'uuid 5. Est-ce une utilisation valide de l'espace de noms?

Ma première approche est assez bonne pour mon cas d'utilisation simple mais je voulais explorer la seconde approche car elle est plus flexible.

Si la création du guid ne peut garantir une unicité raisonnable, une erreur doit être générée. Les objets super compliqués échoueraient sûrement. Comment pourrais-je savoir que c'est le cas si vous utilisez la réflexion?

Je suis à la recherche de nouvelles approches ou préoccupations/implémentations pour la seconde approche.

+0

Qu'est-ce que vous voulez dire que l'on appelle un hachage * *. Vous pouvez utiliser MD5, par exemple. – Robert

+0

Vous ne cherchez pas 'GetHashCode'? https://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=vs.110).aspx –

+0

@tomas Codes de hachage ne sont pas garantis d'être unique, espérons-le sans collision. Ils sont aussi spécifiques à ce type d'objet – ParoX

Répondre

-1

Comme d'autres l'ont dit dans les commentaires, il semble que GetHashCode pourrait faire l'affaire pour vous si vous êtes prêt à se contenter de int comme clé. Sinon, il y a un constructeur qui prend Guidbyte[] de longueur 16. Vous pouvez essayer quelque chose comme

using System.Linq; 
class Foo 
{ 
    public int A { get; set; } 
    public char B { get; set; } 
    public string C { get; set; } 
    public Guid GetGuid() 
    { 
     byte[] aBytes = BitConverter.GetBytes(A); 
     byte[] bBytes = BitConverter.GetBytes(B); 
     byte[] cBytes = BitConverter.GetBytes(C); 
     byte[] padding = new byte[16]; 
     byte[] allBytes = 
      aBytes 
       .Concat(bBytes) 
       .Concat(cBytes) 
       .Concat(padding) 
       .Take(16) 
       .ToArray(); 
     return new Guid(allBytes); 
    } 
} 
+0

Ceci est spécifique à cette classe. Je suppose que l'obtention des octets par réflexion pourrait être un thng. Il n'est pas non plus garanti que le hashcode soit unique et qu'il ne soit pas global. Le hashcode de classe A peut être le même que le class B – ParoX