2012-03-10 25 views
9

Tôi đã tự hỏi làm thế nào để băm một đôi trong Java? Tôi đã băm dữ liệu và các đối tượng nguyên thủy khác. Tôi nghĩ rằng tôi có thể sử dụng phương pháp hashcode? Từ những gì tôi thấy, nó trông khá phức tạp. Tôi bắt gặp một cái gì đó về việc tạo ra một hạt giống.Đập một đôi trong Java

Tôi đã tự hỏi bất kỳ ý tưởng nào về cách thực hiện việc này. Hy vọng để đưa vào với phần còn lại của hashcode của tôi cho các lớp học có đôi?

Tôi đã tự hỏi nếu có vấn đề với tôi cố gắng băm arraylists, mảng và các đối tượng khác trong java. Một số lớp của tôi có chứa arraylists.

Rất cám ơn

Trả lời

20

Double.hashCode() phức tạp? Về cơ bản nó chuyển đổi double thành một long (không có phép thuật ở đây, sau khi tất cả chúng đều đơn giản là giá trị 64 bit trong bộ nhớ) và tính toán băm long khá đơn giản. Việc chuyển đổi double ->long được thực hiện qua public static doubleToLongBits(). Điều gì phức tạp về điều này?

Ví dụ:

Double.valueOf(42.5).hashCode();  //better answer to everything 

Long.valueOf(Double.doubleToLongBits(42.5)).hashCode(); 
+0

Hi Tomasz, tôi đã cố gắng hashcode trên đôi và nhận được thông báo sau đây không thể được dereferenced. Tôi đang chạy phương thức hashcode() trên phương thức getClassMethod() tức là this.getClassMethod(). HashCode(); GetClassMethod trả về giá trị double. – daveb

+0

@daveb: hãy xem các ví dụ tôi vừa thêm vào câu trả lời của mình. –

+0

Cảm ơn @Thomasz, tôi đã int hash6 = Double.valueOf (this.getClassMethod()). HashCode(); và nó được biên soạn mà không có vấn đề trước đó. Dòng mã có ổn không? Chúc mừng DaveB – daveb

2

Tùy thuộc vào những gì bạn cần cái này kiếm, bạn có thể đi với một cách tiếp cận rất đơn giản chỉ mod (ing) nó.

int hash(double d) { 
    return d % 71; //use a prime number here 
} 

Nếu nó chỉ để lưu trữ một vài đôi trong một băm, điều này nên làm điều đó. Nếu bạn muốn trải băm, chỉ cần tăng "71"

+0

Đây là một hàm băm kém, nó sẽ trả về cùng một giá trị để tăng gấp đôi gần nhau. Và nếu chương trình của bạn chỉ cần tăng gấp đôi từ 0 đến 1 thì sao? Hàm băm không đổi. –

+0

Tôi băm lên tất cả các trường của các lớp khác, và ghi đè hashcode, bằng và chuỗi cho tất cả các lớp của tôi. Vì vậy mà tôi có thể so sánh các đối tượng từ chúng và cũng đảm bảo rằng các đối tượng là duy nhất là tốt. Tôi đã sử dụng 31 số nguyên tố và ghép các mã băm vào 1. Giá trị của tôi là giá của một mặt hàng. DaveB – daveb

+1

@TomaszNurkiewicz hoàn toàn đồng ý! Đó là lý do tại sao tôi bắt đầu với "tùy thuộc vào những gì bạn cần này cho". Nếu bạn "biết" giá trị của bạn là tất cả giữa 0 và 1 bạn nên sử dụng cái gì khác. – krico

2

Cách Java thực hiện việc này là chuyển đổi bit thô của một đôi thành một khoảng thời gian dài.

// from Double. 
public static long doubleToLongBits(double value) { 
    long result = doubleToRawLongBits(value); 
    // Check for NaN based on values of bit fields, maximum 
    // exponent and nonzero significand. 
    if (((result & DoubleConsts.EXP_BIT_MASK) == 
      DoubleConsts.EXP_BIT_MASK) && 
     (result & DoubleConsts.SIGNIF_BIT_MASK) != 0L) 
     result = 0x7ff8000000000000L; 
    return result; 
} 

public int hashCode() { 
    long bits = doubleToLongBits(value); 
    return (int)(bits^(bits >>> 32)); 
} 

Lưu ý: Có nhiều giá trị của NaN (và hai loại) nhưng Java coi chúng như nhau.

1

một này làm việc cho tôi

int h2 = new Double(area).hashCode(); 
Các vấn đề liên quan