2016-06-14 5 views
-1

Ich muss die Nummern 0-100000 einem Hash zuweisen, ohne einen Schlüssel zu geben.So fügen Sie einen Wert zu einem vorhandenen Hash ohne Schlüssel hinzu

Ruby verwendet Murmur als Hash-Funktion. Wie kann ich einen Wert hinzufügen, ohne einen Schlüssel zu haben, wie in C, damit er Kollision und andere Dinge behandelt. Ist es möglich? Kann ich nur den Wert für Hash geben und den Schlüssel auswerten lassen, dann in ihn einfügen?

In einer normalen Hash-Operation haben wir eine Hash-Funktion und eine Tabelle. Wir verwenden value als Argument der Hash-Funktion, dann erhalten wir einen Schlüssel als Gegenleistung. Der Wert wird an der Schlüsselposition in der Tabelle eingefügt (wenn eine Kollision auftritt, doppeltes Hashing oder etwas anderes verwendet).

Ist es möglich, die gleiche Art von Hashing in Ruby zu tun? Oder bin ich mit Standardwegen festgefahren? Kann ich den Wert einfach in eine Funktion schreiben, dann wertet er den Schlüssel aus und fügt den Wert in die Hash-Tabelle ein oder nicht?

+1

Also, warum nicht ein Array? Wenn Sie nicht an Schlüsseln interessiert sind. – Ursus

+0

Ich versuche einen Vergleich zwischen Utash von C und Hashes von Ruby zu machen. Ich muss einen Hash mit Elementen 0-100K erstellen und suche nach Elementen zwischen 0-200K. Dann werde ich die Speicher- und Zeitnutzung vergleichen, aber es muss ein Hash sein. – wackyburkay

+0

"Kann ich nur den Wert für Hash geben und lassen Sie es den Schlüssel auswerten" - welcher Schlüssel? Du hast keins zur Verfügung gestellt. Wenn Sie versuchen, die Kollisionsabfrage und Ähnliches zu testen, verwenden Sie vielleicht den gleichen Schlüssel für alle Werte? –

Antwort

0

Die übliche Lösung besteht darin, den Wert einfach als Schlüssel zu verwenden. Daraus folgt:

value = "xxx" 
hash[value] = 1 

Auf diese Weise dokumentieren Sie deutlich, dass die tatsächlichen Werte (alle 1) dieses bestimmten Hash zwecklos sind, und Sie werden dedupliziert Werte. Hash wird intern das übliche Hashing durchführen, Sie brauchen sich überhaupt keine Gedanken darüber zu machen.

Ich benutze 1 als Wert hier, aber der tatsächliche Wert ist völlig irrelevant. Ich verwende nil nicht als das ist der Standard-Rückgabewert von hash[nonexistant_value].

Wenn Ihre Werte komplexer sind, überprüfen Sie http://docs.ruby-lang.org/en/2.0.0/Hash.html für Details über sie.

1

speichern einfach in den Hash des berechneten Hash-Wert des Schlüssels, anstatt den Schlüssel selbst:

hash[hash_func(key)] = value 

Das heißt, statt Mapping key ->value direkt, diese Karten hash_func(key) -> Wert. Die Implementierung kann Ihren Hash-Schlüsselwert intern durch eine andere Hash-Funktion weiterleiten, aber Sie müssen sich nicht darum kümmern.

Allerdings kommt in den Kommentaren nun zum Vorschein, dass Sie die Hash-Funktion auf den Wert anwenden möchten, keinen anderen Schlüssel. In diesem Fall verwenden Sie einfach eine set und damit fertig sein. Dann müssen Sie dem Satz nur noch Werte hinzufügen:

s = Set.new 
s.add(value) 

Es gibt keine Notwendigkeit, den Hash von irgendetwas zu berechnen; Set wird sich darum kümmern.

Kurz gesagt, dies scheint ein Fall der XY Problem zu sein. Sie mussten eine Reihe von Werten in einer Datenstruktur speichern (und vermutlich prüfen können, ob diese Werte auf effiziente Weise gespeichert wurden). Anstatt danach zu fragen, haben Sie nach Hash-Funktionen und -Tabellen gefragt. Wenn Sie gefragt hätten, was Sie wirklich brauchen, anstatt nach etwas anderem zu fragen, von dem Sie dachten, dass Sie es verwenden könnten, um das ursprüngliche Problem zu lösen, hätten Sie viel schneller eine nützliche Antwort bekommen.

+0

Danke! Das war die Sache, die ich meinte. Aber dann muss ich meine eigene Hash-Funktion schreiben oder? Wenn ich falsch liege, wie kann ich dann den Hashwert des Schlüssels erhalten? – wackyburkay

+0

@wackyburkay Wenn Sie "Ihre eigene Hash-Funktion schreiben müssen", dann verwenden Sie einfach einen einfachen, regulären Ruby-Hash? Ich vermutete, dass Sie bereits eine Hash-Funktion hatten. Wenn Sie das nicht tun, macht Ihre Frage keinen Sinn. – davmac

+0

In einer normalen Weise würde ich diese Prozedur verwenden: 1. Geben Sie Wert an die Hash-Funktion. 2.get-Taste 3.instert Wert auf die [Schlüssel] Position 4. wenn eine Kollision passiert, behandeln Sie es. Aber in Ruby kann ich einfach etwas wie hash.add (x) tun, weil es auch den Schlüssel zum Hinzufügen benötigt. Du hast gesagt "Benutze normalen Ruby Hash". Ohne Schlüssel, wie kann ich? Ich füge ganze Zahlen von 0-100K hinzu, aber ich kann sie nicht mit 1,2,3 "keyen" ... Ich möchte nicht, dass mein Hash genau wie ein Array ist, da müssen einige Buckets sein. Wie kann ich dies mit normalem Ruby Hash erreichen? Wenn ich nicht kann, muss ich eine Hash-Funktion schreiben. – wackyburkay