2011-06-30 40 views
7

Tôi muốn tạo giá trị băm 32 bit. Tôi có 16 byte địa chỉ nguồn và đích ipv6 và 2 số cổng nguồn và đích.Cần hàm băm để tạo giá trị 32 bit trong số ipv6 16 Địa chỉ byte và số cổng TCP 2 Byte

32 bit Output = (Src IP, Dst Ip, Src Cảng, Đích Port)

Sẽ tốt hơn nếu hàm băm phân phối các thực thể cũng cùng không gian 32 bit. Tôi muốn sử dụng kết quả làm chỉ mục.

Resit

+0

là yêu cầu hiệu suất cao? – Alnitak

+0

Tại sao không sử dụng MD5 hoặc SHA-1 và cắt các bit không cần thiết? Mặc dù, tôi phải nói, điều đó sẽ lãng phí rất nhiều thông tin. Hay bạn có bất kỳ yêu cầu nào khác như tốc độ hoặc mức tiêu thụ bộ nhớ? – RedX

+0

@RedX - xem ^^ _là hiệu suất cao một yêu cầu_ :) – Alnitak

Trả lời

1

Xem Eternally Confuzzled đối với một số thông tin chung về hàm băm và một số thuật toán nổi tiếng; Tôi có thể đi với hàm băm một lần tại thời điểm của FNV hoặc Jenkins.

5

khác, có thể tham khảo hữu ích:

General Purpose Hash Function Algorithms

CityHash by Google

Lưu ý rằng, nó là rất khó để tạo ra một không va chạm đảm bảo hàm băm (không có kết quả đầu vào khác nhau trong cùng mã băm). Có rất nhiều giải pháp cho vấn đề này, đơn giản nhất là giải quyết mở.

Open Addressing

+3

Cảm ơn bạn, Chức năng Hash Mục đích chung Thuật toán dường như là cách để đi. Tôi sẽ thử nghiệm với các thuật toán của họ. –

3

32 bit cho chỉ mục? Bàn của bạn lớn đến mức nào ?!

Hãy xem xét hầu hết các địa chỉ IPv6 sẽ dựa trên địa chỉ phần cứng. Hãy nhìn vào 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| 
+----------------+----------------+----------------+ 

Đó là trường hợp, hãy thử hack này nhanh chóng và dơ bẩn đó sẽ làm việc trong hầu hết các trường hợp (giả định một phân bố của các cổng và địa chỉ MAC):

  • Lấy thấp hơn 16 bit của địa chỉ IPv6 nguồn. Dịch chuyển nó 16 bit sang trái và OR với 16 byte thấp hơn của địa chỉ IP đích
  • Lấy cổng nguồn. Chuyển nó sang bên trái 16 bit và OR nó với cổng đích
  • XOR kết quả của các giá trị hai trên 32-bit cùng

Nếu người dùng đang sử dụng các địa chỉ bằng tay được giao, hàm băm này giành' t được phân phối rất đều, nhưng tôi nghĩ rằng trong hầu hết các trường hợp, nó sẽ rất gần. Bạn có thể ném vào (XOR) một số bit từ phần trên của địa chỉ nếu bạn muốn.

+0

Điều này rất hữu ích. Tôi không xem xét quy trình tạo địa chỉ ipv6. Tôi không sử dụng chỉ mục 32 bit. Thuật toán của chúng tôi rất đơn giản, nó tính toán giá trị 32 bit, sau đó chúng tôi lấy mô đun đầu ra theo kích thước của bộ đệm của chúng tôi. Tôi không biết nó hiệu quả như thế nào, nhưng nó hoạt động. Vấn đề là, tôi muốn sử dụng cùng một bảng băm cho 128 và 32 bit chỉ mục đầu vào. –

1

murmurhash rất nhanh và được kính trọng, theo như tôi có thể biết. Nó không phải là cường độ mã hóa, nhưng nó phải phù hợp với mục đích của bạn.