2011-06-30 10 views
7

Chcę utworzyć wartość skrótu 32-bitową. Mam 16-bajtowe źródłowe i docelowe adresy IPv6 oraz 2-bajtowe numery źródłowe i docelowe portów.Potrzebuję funkcji mieszania, aby utworzyć 32-bitową wartość z adresu IP 16 16 Adres bajtowy i TCP 2 numery portów bajtowych

32 bit wyjściowy = (Src IP, Dst Ip, Src Port Dest Port)

Byłoby lepiej, gdyby funkcja hash dystrybucję jednostek dobrze wzdłuż przestrzeni 32 bitowej. Chcę użyć wyniku jako indeksu.

Reşit

+0

jest wymaganiem wysokiej wydajności? – Alnitak

+0

Dlaczego nie używać MD5 lub SHA-1 i odciąć niepotrzebne bity? Chociaż muszę powiedzieć, że zmarnowałoby to wiele informacji. Czy masz jakieś inne wymagania, takie jak szybkość lub zużycie pamięci? – RedX

+0

@RedX - patrz ^^ _jest wysoka wydajność wymaganie_ :) – Alnitak

Odpowiedz

1

Zobacz Eternally Confuzzled jakiegoś ogólnych informacji na temat funkcji skrótu oraz kilku znanych algorytmów; Prawdopodobnie pójdę z hashem FNV lub Jenkinsa "One-at-a-time".

5

Innym, może być użyteczne referencje:

General Purpose Hash Function Algorithms

CityHash by Google

zauważyć, że bardzo trudno jest dokonać bez kolizji gwarantowana funkcji mieszającej (nie inny wynik wejściowe w tym samym kodem hash). Istnieje wiele rozwiązań tego problemu, z których najprostszym jest adresowanie otwarte.

Open Addressing

+3

Dziękuję, Algorytmy funkcji skrótu ogólnego celu wydają się być drogą do zrobienia. Będę eksperymentować z ich algorytmami. –

3

32 bity wskaźnika? Jak duży jest twój stół ?!

Należy wziąć pod uwagę, że większość adresów IPv6 będzie oparta na adresie sprzętowym. Spójrz na RFC 4291:

[EUI64] defines a method to create an IEEE EUI-64 identifier from an 
IEEE 48-bit MAC identifier. This is to insert two octets, with 
hexadecimal values of 0xFF and 0xFE (see the Note at the end of 
appendix), in the middle of the 48-bit MAC (between the company_id 
and vendor-supplied id). An example is the 48-bit IEEE MAC with 
Global scope: 

|0    1|1    3|3    4| 
|0    5|6    1|2    7| 
+----------------+----------------+----------------+ 
|cccccc0gcccccccc|ccccccccmmmmmmmm|mmmmmmmmmmmmmmmm| 
+----------------+----------------+----------------+ 

Skoro tak, spróbuj to szybki i zabrudzony hack, który będzie działać w większości przypadków (zakładając równomierny rozkład portów i adresów MAC):

  • podejmują niższe 16 bitów źródłowego adresu IPv6. Przesuń 16 bitów w lewo i LUB dolne 16 bajtów docelowego adresu IP
  • Weź port źródłowy. Przesunąć go w lewo o 16 bitów i OR go z portem docelowym
  • XOR wynikiem wartościami dwa powyżej 32-bitowych razem

Jeśli użytkownik korzysta z ręcznie przypisane adresy, ta funkcja hash wygrał” t być bardzo równomiernie rozmieszczone, ale myślę, że w większości przypadków będzie blisko. Możesz wrzucić (XOR) kilka bitów z górnej części adresu, jeśli chcesz.

+0

To było bardzo pomocne. Nie rozważałem procedury tworzenia adresów IPv6. Nie używam indeksu 32-bitowego. Nasz algorytm jest bardzo prosty, oblicza wartość 32-bitową, następnie pobieramy moduł wyjścia według wielkości naszego bufora. Nie wiem, jaki on jest skuteczny, ale działa. Problem polega na tym, że chcę użyć tej samej tabeli mieszania dla 128- i 32-bitowych indeksów wejściowych. –

1

murmurhash jest bardzo szybki i dość szanowany, o ile mogę powiedzieć. Nie jest to siła kryptograficzna, ale powinna być adekwatna do twoich celów.