2012-01-21 10 views
7

Estoy implementando una función hash Skein en Java, y tengo un problema con una parte donde algunas adiciones son módulo 2^64. Como yo sé, long in java tiene un valor máximo = 2^63-1. Entonces mi problema es cómo implementar esta operación de módulo. (Todas las operaciones en Skein están en palabras de 64 bits).Cómo mod2^64 de largo en Java?

+1

Si no necesita que sea súper rápido, puede usar ['BigInteger'] (http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigInteger.html) – dasblinkenlight

Respuesta

6

long en Java es de 64 bits, por lo que todas las operaciones son mod 2^64 ya. No tienes que hacer nada extra para que eso suceda.

¿El problema es que no sabe cómo manejar los valores firmados?

¿Esto es algo que quiere o es algo que está tratando de evitar?

+0

Gracias, esto fue útil. Esto es exactamente lo que quiero Voy a estar operando solo en bits al final, así que no me importa un poco de señal. –

+0

El único problema que tiene es para las operaciones donde el signo importa. p.ej. Long.toString (largo) imprimirá un signo. Sin embargo, muchas operaciones funcionan en los bits como se esperaría sin firmar o firmado. –

+0

Al final de todas las operaciones, voy a ensamblar todas las palabras de 64 bits en Byte [] de 512 bits, y luego voy a interpretar todo como hexadecimal o cadena, todavía no lo sé. –

2

Además de la respuesta de Peter, quiero sugerir que eche un vistazo a la gran biblioteca Guava. Tiene una clase UnsignedLongs que ofrece varias funciones de utilidad para trabajar con longs tratándolas como unsigned. Esto podría ser útil para ti.

+2

autor de' UnsignedLongs' aquí: la respuesta de Peter es en su mayoría precisa incluso para longs sin firmar. Específicamente, +, - y * son todos correctos incluso si trata valores largos como Además, puede que le resulte útil utilizar la clase contenedora 'UnsignedLong', que puede usar como' BigInteger' pero funciona mod 2^64. –

Cuestiones relacionadas