2012-01-21 5 views
7

Tôi đang triển khai hàm băm Skein trong Java và tôi gặp vấn đề với một số phần bổ sung nơi modulo 2^64. Như chúng ta đã biết, dài trong java có giá trị tối đa = 2^63-1. Vì vậy, vấn đề của tôi là, làm thế nào để thực hiện thao tác modulo này. (Tất cả các thao tác trong Skein đều có các từ 64 bit.)Làm thế nào để mod2^64 trong dài trong Java?

+1

Nếu bạn không cần siêu nhanh, bạn có thể sử dụng ['BigInteger'] (http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigInteger.html) – dasblinkenlight

Trả lời

6

long trong Java là 64 bit nên tất cả các thao tác đều đã được mod 2^64 rồi. Bạn không phải làm bất cứ điều gì thêm để làm cho điều đó xảy ra.

Có phải vấn đề mà bạn không biết cách xử lý các giá trị đã ký không?

Đây có phải là thứ bạn muốn hoặc là thứ bạn đang cố gắng tránh không?

+0

Cảm ơn bạn, điều này rất hữu ích. Đây chính xác là những gì tôi muốn. Tôi sẽ chỉ hoạt động trên bit ở cuối, vì vậy tôi không quan tâm đến một chút dấu hiệu. –

+0

Vấn đề duy nhất bạn có là cho các hoạt động mà dấu hiệu quan trọng. ví dụ. Long.toString (dài) sẽ in một dấu hiệu. Tuy nhiên, nhiều thao tác hoạt động trên các bit như bạn mong đợi không được ký hoặc được ký. –

+0

Khi kết thúc tất cả các hoạt động, tôi sẽ lắp ráp tất cả các từ 64 bit vào Byte [] 512 bit, và sau đó tôi sẽ giải thích tất cả dưới dạng hex hoặc chuỗi, tôi chưa biết. –

2

Ngoài câu trả lời của Peter, tôi muốn đề nghị xem thư viện Guava tuyệt vời. Đô thị này có một lớp học UnsignedLongs trong đó cung cấp một số chức năng tiện ích để làm việc với thời gian dài xử lý chúng như unsigned. Điều này có thể hữu ích cho bạn.

+2

Tác giả của 'UnsignedLongs' ở đây: Câu trả lời của Peter hầu như là chính xác ngay cả đối với những khoảng thời gian chưa được ký, cụ thể là +, -, và * đều chính xác ngay cả khi bạn xử lý các giá trị dài Ngoài ra, bạn có thể thấy hữu ích khi chỉ sử dụng lớp trình bao bọc 'UnsignedLong', mà bạn có thể sử dụng như' BigInteger' nhưng hoạt động mod 2^64. –