Derzeit habe ich eine Lösung, wo ich Objekte, die mich interessieren, verfolgen, indem ich ihren Hashcode über Object.GetHashCode
erhalte und sie dann in einem HashSet<int>
speichern.Ist es möglich, Hashcodes als Bitmaske zu verwenden, um Sammlungsmitgliedschaft effizient zu speichern/zu verfolgen?
Allerdings habe ich auch über Bitmasken und bitweise Operationen gelernt, und ich bin ziemlich fasziniert von ihnen. Here is a great question, die ich in der Nähe zu dem, was ich suche, gefunden habe. Ich kann jedoch nicht scheinen, dass dies effizient für Hash-Codes funktioniert.
There is also this question, aber es scheint sich mit 5-Bit-Nummern zu beschäftigen, wenn Hash-Codes int
's (32-Bit) sind.
Ich bekomme die Lösung (von der ersten referenzierten Frage) funktioniert, aber es ist nicht so schnell wie meine aktuelle HashSet-Ansatz ist. Dies ist auf die schiere Anzahl der Elemente in zurückzuführen, die erstellt werden müssen, um alle bekannten Hash-Codes zu berücksichtigen (int.MaxValue
).
Gibt es eine bitmask/bitweise Operation, die ich bei der Arbeit mit einem BitArray
berücksichtigen sollte? Oder bin ich hier völlig ausgetreten und sollte einfach bei meiner HashSet<int>
Lösung bleiben?
fyi verwenden Sie gethashcode nicht, Kollision kann leicht passieren! http: // Stapelüberlauf.com/questions/7968753/Wahrscheinlichkeit-erhalten-ein-Duplikat-Wert-wenn-Aufruf-gethashcode-on-Strings – Fredou
Sie sollten speichern * die Objekte selbst * in der 'HashSet', nicht speichern ihre' GetHashCode' Werte . Indem Sie nur die Hashes speichern, entfernen Sie die Fähigkeit des 'HashSet', Kollisionen zu verwalten. Was den Rest der Frage betrifft, so basiert dies auf der Prämisse, dass der Hash für jedes Objekt einzigartig ist, aber das ist eine falsche Annahme, so dass Sie das nicht tun können. Legen Sie die Gegenstände einfach in ein 'HashSet'. – Servy
@Servy, das ist ein guter Punkt, und Sie haben mich mein Design hier überdenken lassen. Ich hatte gehofft, Informationen zu speichern, ohne eine starke Referenz in Erinnerung an das Objekt zu erstellen und es so schnell wie möglich zu machen. Klingt so, als ob ich schon die Lösung gefunden hätte (nur dafür, dass ich das gemacht habe!). –