L'article MSDN here états, que la mise en œuvre par défaut de GetHashCode() ne garantit pas des résultats uniques et ne devraient pas être utilisé comme identifiant. Donc, ma question est de savoir si DateTime.Now a sa propre implémentation qui donnerait des hachages uniques. Thx pour l'aideEst-ce que DateTime.Now a sa propre implémentation de GetHashCode qui donne des hachages uniques?
Répondre
D'abord, ce serait une erreur de compter sur la mise en œuvre particulière de GetHashCode
pour DateTime
. C'est quelque chose qui vous est caché. S'appuyer sur des détails cachés est une mauvaise odeur de code; ils pourraient changer sur vous à tout moment et casser votre code.
Ensuite, il s'avère que DateTime
stocke en interne un entier de 64 bits DateTime.Ticks
qui mesure le nombre d'unités de 100 nanosecondes depuis l'époque (minuit le 1er janvier 0001). Par conséquent, DateTime
instances nécessitent au moins 64 bits d'informations. Mais les codes de hachage sont des entiers 32 bits et par conséquent les codes de hachage ne peuvent pas être uniques (vous ne pouvez pas mapper l'espace 64 bits à l'espace 32 bits sans collisions).
Pour être explicite, vous pouvez voir le code source pour DateTime.GetHashCode
:
public override int GetHashCode() {
long internalTicks = this.InternalTicks;
return (((int) internalTicks)^((int) (internalTicks >> 0x20)));
}
Comme vous pouvez le voir, il fait un peu « pliage » pour presser InternalTicks
dans un entier de 32 bits.
En général, ne comptez pas sur les codes de hachage étant unique. L'espace d'entrée est généralement plus grand que l'espace devant être haché (l'espace de tous les entiers de 32 bits). Si vous devez absolument avoir une clé unique pour représenter un objet DateTime
, utilisez DateTime.ToBinary
. Cela vous donnera un entier de 64 bits qui est unique et peut être utilisé pour reconstituer le DateTime
(utilisation DateTime.FromBinary
).
DateTime.Now renvoie une valeur DateTime dont je suis sûr qu'il a sa propre implémentation du code de hachage. Voici la mise en œuvre.
public override int GetHashCode()
{
long internalTicks = this.InternalTicks;
return (((int) internalTicks)^((int) (internalTicks >> 0x20)));
}
Non, ce n'est pas le cas. Stocke en interne sa valeur sous la forme long
contenant unis de 100 nanosecondes depuis le 01/01/0001. Comme GetHashCode
renvoie un entier de 32 bits, il est impossible qu'il soit complètement indisponible.
Voici la mise en œuvre de DateTime
:
public override int GetHashCode() {
Int64 ticks = InternalTicks;
return unchecked((int)ticks)^(int)(ticks >> 32);
}
Hmmm, Pourquoi la tienne est-elle différente? – ChaosPandion
Je l'ai obtenu à partir du code source de référence. – SLaks
J'ai reçu le mien de Reflector. – ChaosPandion
- 1. Comment créer un "partial" qui a sa propre action?
- 2. Comment implémentez-vous GetHashCode() sur des objets?
- 3. IPython avec sa propre portée?
- 4. Pourquoi VIM a-t-il sa propre syntaxe regex?
- 5. Implémentation de GetHashCode basé sur une chaîne de connexion
- 6. Comment s'assurer que xml.dom.minidom peut analyser sa propre sortie?
- 7. Configuration de Grails pour utiliser sa propre implémentation DataSource ou pour proxy DataSource standard
- 8. Ruby XML: donne des nœuds uniques XML existants à lire
- 9. Implémentation de mon propre aperçu avant impression?
- 10. Optimisation des alternatives à DateTime.Now
- 11. Culture Sensitive GetHashCode
- 12. Est-ce que C# a les mêmes problèmes que Java avec equals et gethashcode()?
- 13. Comment utiliser Object.GetHashCode() sur un type qui remplace GetHashCode()
- 14. Affectation Chaque clé primaire sa propre colonne
- 15. plugin jQuery avec sa propre API
- 16. comment créer sa propre fonction dans JQuery?
- 17. Est-ce que quelqu'un a une implémentation de sp_helpcolumn?
- 18. rediriger les résultats de l'application Web vers sa propre application
- 19. Création de la propre implémentation de Boost :: Archive
- 20. Windows dispose de sa propre fonction « d'appel autre .exe » (C++)
- 21. Pourquoi WPF a-t-il sa propre classe de couleur au lieu de simplement utiliser Drawing.Color?
- 22. Impression d'un fichier externe dans sa propre impression de routine
- 23. mise en page à l'intérieur de chaque onglet? - (chaque onglet a sa propre activité)
- 24. Comment un NSTextField sait-il que sa valeur a changé?
- 25. le code le plus rapide pour générer des hachages base62 uniques
- 26. GetHashCode() avec les clés de chaîne
- 27. Dates de style de calendrier d'événements pour sa propre catégorie
- 28. Faire une largeur d'image 100% de div div, mais pas plus grand que sa propre largeur
- 29. JPA - Puis-je créer une classe Entity, en utilisant @DiscriminatorValue, qui n'a pas sa propre table?
- 30. Générer des noms uniques?
La question est formulée un peu étrange. La structure DateTime a une implémentation de GetHashCode(). DateTime.Now est une propriété statique qui renvoie une instance DateTime. – jeroenh