2016-05-09 17 views
0

Listen sind nicht hashbar. Allerdings bin ich implementing LSH und ich bin Suche nach einer Hash-Funktion, die eine Liste von positiven ganzen Zahlen (in [1, 29.000]) zu k Eimern entsprechen wird. Die Anzahl der Listen ist D, wobei D> k (glaube ich) und D = 40.000, wobei k noch nicht bekannt ist (offen für Vorschläge).Wie Hash-Listen?


Beispiel (D = 4, k = 2):

118 | 27 | 1002 | 225 
128 | 85 | 2000 | 8700 
512 | 88 | 2500 | 10000 
600 | 97 | 6500 | 24000 
800 | 99 | 7024 | 25874 

Die erste Spalte sollte als Eingabe in die Hash-Funktion und gibt die Nummer eines Eimers gegeben werden.


Was ich verwirrt ist, dass wir eine Reihe Hash, sondern eine Säule, das heißt eine Liste von positiven ganzen Zahlen nicht für eine Funktion suchen.

Irgendwelche Ideen bitte?

ich verwende, wenn das

+0

Wie wäre es nur das Umwandeln es Typen hashable, wie Tupel? (zB Hash (Tupel ([1, 2, 3]))) – hunminpark

+0

@hunminpark Du meinst etwas wie 'print hash (tuple ([1,2,3,4,5]))'? Das ist, was @lejlot vorgeschlagen hat, aber er löschte seine Antwort. – gsamaras

+0

Nur um zu verdeutlichen, meinst du, du willst eine Liste nehmen und einen einzelnen Bucket-Index erzeugen, oder willst du eine Liste von Länge 'n' nehmen und produzieren 'n' Bucket-Indizes? – mobiusklein

Antwort

3

Sie zählt kann es kurz vor dem in einem hashable Typ konvertieren:

In [4]: hash(l) 
TypeError: unhashable type: 'list' 

hash(tuple(l)) % k # 29000 
Out[5]: 70846 
+0

Es gibt eine gelöschte Antwort, die ein "Tupel" anstelle eines "Str" vorgeschlagen hat. Irgendwelche Gedanken dazu? – gsamaras

+1

Ja, es ist schneller! da keine Kopie gemacht wird ..... –