Author: nextgens
Date: 2008-11-21 19:22:03 +0000 (Fri, 21 Nov 2008)
New Revision: 23787
Modified:
trunk/contrib/java-test/org/spaceroots/mantissa/random/MersenneTwisterTest.java
trunk/contrib/java/org/spaceroots/mantissa/random/MersenneTwister.java
Log:
freenet-ext: better fix for MT and updated test vectors
Modified: trunk/contrib/java/org/spaceroots/mantissa/random/MersenneTwister.java
===================================================================
--- trunk/contrib/java/org/spaceroots/mantissa/random/MersenneTwister.java
2008-11-21 19:12:03 UTC (rev 23786)
+++ trunk/contrib/java/org/spaceroots/mantissa/random/MersenneTwister.java
2008-11-21 19:22:03 UTC (rev 23787)
@@ -149,26 +149,27 @@
// constructors after array allocation
return;
}
- int[] seeds = new int[seed.length/4];
- for(int i=0;i<seeds.length;i++) {
- seeds[i] = MersenneTwister.bytesToInt(seed, i*4);
- }
+ int[] seeds = MersenneTwister.bytesToInts(seed, 0, seed.length);
setSeed(seeds);
}
/**
* A copy of our @see{freenet.support.Fields}
* */
- public static int bytesToInt(byte[] buf, int offset) {
- if(buf.length < 4)
+ public static int[] bytesToInts(byte[] buf, int offset, int length) {
+ if(length % 4 != 0)
throw new IllegalArgumentException();
- int x = 0;
- for(int j = 3; j >= 0; j--) {
- int y = (buf[j + offset] & 0xff);
- x = (x << 8) | y;
+ int[] ints = new int[length / 4];
+ for(int i = 0; i < ints.length; i++) {
+ int x = 0;
+ for(int j = 3; j >= 0; j--) {
+ int y = (buf[j + offset + i * 4] & 0xff);
+ x = (x << 8) | y;
+ }
+ ints[i] = x;
}
- return x;
- }
+ return ints;
+ }
/** Reinitialize the generator as if just built with the given int
array seed.
* <p>The state of the generator is exactly the same as a new
Modified:
trunk/contrib/java-test/org/spaceroots/mantissa/random/MersenneTwisterTest.java
===================================================================
---
trunk/contrib/java-test/org/spaceroots/mantissa/random/MersenneTwisterTest.java
2008-11-21 19:12:03 UTC (rev 23786)
+++
trunk/contrib/java-test/org/spaceroots/mantissa/random/MersenneTwisterTest.java
2008-11-21 19:22:03 UTC (rev 23787)
@@ -1,5 +1,7 @@
package org.spaceroots.mantissa.random;
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -13,50 +15,62 @@
private static final int[] INT_SEED = new int[SEED_SIZE];
private static final byte[] BYTE_SEED;
- private static final char[] EXPECTED_OUTPUT_MT_INT = new char[] {
- (char)0x9a, (char)0x6, (char)0xab, (char)0x8c, (char)0x2b, (char)0xf3,
- (char)0x3d, (char)0x7f, (char)0x6, (char)0x4, (char)0x5b, (char)0x20ac,
- (char)0x46, (char)0xdd, (char)0xdf, (char)0x47, (char)0x28, (char)0xc0,
- (char)0xb7, (char)0x74
+ static {
+ ByteBuffer bb = ByteBuffer.allocate(INT_SEED.length*4);
+ for(int i=0; i<INT_SEED.length; i++){
+ INT_SEED[i] = i;
+ bb.putInt(i);
+ }
+ BYTE_SEED = bb.array();
+ }
+
+ private static final int[] INPUT_1 = new int[] {
+ 123456789, 123456789, 123456789, 123456789
+ };
+ private static final byte[] OUTPUT_1 = new byte[] {
+ (byte)0x15, (byte)0xCD, (byte)0x5B, (byte)0x7,
+ (byte)0x15, (byte)0xCD, (byte)0x5B, (byte)0x7,
+ (byte)0x15, (byte)0xCD, (byte)0x5B, (byte)0x7,
+ (byte)0x15, (byte)0xCD, (byte)0x5B, (byte)0x7
+ };
+
+ private static final byte[] EXPECTED_OUTPUT_MT_INT = new byte[] {
+ (byte)0x9a, (byte)0x6, (byte)0xab, (byte)0x8c, (byte)0x2b, (byte)0xf3,
+ (byte)0x3d, (byte)0x7f, (byte)0x6, (byte)0x4, (byte)0x5b, (byte)0x20ac,
+ (byte)0x46, (byte)0xdd, (byte)0xdf, (byte)0x47, (byte)0x28, (byte)0xc0,
+ (byte)0xb7, (byte)0x74
};
- private static final char[] EXPECTED_OUTPUT_MT_LONG = new char[] {
- (char)0x4f, (char)0x75, (char)0xda, (char)0x52, (char)0xe2, (char)0x40,
- (char)0xf0, (char)0x1, (char)0x8a, (char)0x69, (char)0xf6, (char)0xcb,
- (char)0x1a, (char)0xe3, (char)0x1, (char)0xb6, (char)0x21, (char)0x1f,
- (char)0x73, (char)0xec
+ private static final byte[] EXPECTED_OUTPUT_MT_LONG = new byte[] {
+ (byte)0x4f, (byte)0x75, (byte)0xda, (byte)0x52, (byte)0xe2, (byte)0x40,
+ (byte)0xf0, (byte)0x1, (byte)0x8a, (byte)0x69, (byte)0xf6, (byte)0xcb,
+ (byte)0x1a, (byte)0xe3, (byte)0x1, (byte)0xb6, (byte)0x21, (byte)0x1f,
+ (byte)0x73, (byte)0xec
};
- private static final char[] EXPECTED_OUTPUT_MT_INTS = new char[] {
- (char)0x1c, (char)0x58, (char)0xb0, (char)0x47, (char)0x92, (char)0xc7,
- (char)0x178, (char)0xc4, (char)0x25, (char)0x64, (char)0x31, (char)0x27,
- (char)0x12, (char)0x14, (char)0xdb, (char)0xf, (char)0x61, (char)0x160,
- (char)0x73, (char)0x32
+ private static final byte[] EXPECTED_OUTPUT_MT_INTS = new byte[] {
+ (byte)0x1C, (byte)0x58, (byte)0xB0, (byte)0x47, (byte)0x92,
+ (byte)0xC7, (byte)0xBE, (byte)0xC4, (byte)0x25, (byte)0x64,
+ (byte)0x31, (byte)0x27, (byte)0x12, (byte)0x14, (byte)0xDB,
+ (byte)0xF, (byte)0x61, (byte)0xA6, (byte)0x73, (byte)0x32
};
- private static final char[] EXPECTED_OUTPUT_MT_BYTES = new char[] {
- (char)0xca, (char)0xcd, (char)0xcf, (char)0x14, (char)0x37, (char)0x22,
- (char)0x27, (char)0x85, (char)0x91, (char)0x44, (char)0x2a, (char)0x8,
- (char)0xb3, (char)0x33, (char)0xfa, (char)0x67, (char)0x69, (char)0x18,
- (char)0xca, (char)0x72
+ private static final byte[] EXPECTED_OUTPUT_MT_BYTES = new byte[] {
+ (byte)0x5C, (byte)0x6, (byte)0xAD, (byte)0x71, (byte)0x56,
+ (byte)0xDB, (byte)0xBE, (byte)0x69, (byte)0x87, (byte)0xDF,
+ (byte)0xC4, (byte)0x3B, (byte)0xCB, (byte)0x71, (byte)0x73,
+ (byte)0xF1, (byte)0x9B, (byte)0xED, (byte)0x9, (byte)0x2D,
};
- static {
- StringBuilder sb = new StringBuilder();
- for(int i=0; i<INT_SEED.length; i++){
- INT_SEED[i] = i;
- sb.append(i);
- }
- BYTE_SEED = sb.toString().getBytes();
- }
-
public MersenneTwisterTest(String name) {
super(name);
}
- public void testBytesToInt() {
+ public void testBytesToInts() {
// Test the consistency in order to avoid the freenet-ext #24 fiasco
- byte[] bytes = new byte[] { 0, 1, 2, 2 };
- int outLong = MersenneTwister.bytesToInt(bytes, 0);
- assertEquals(outLong, 33685760);
+ int[] output = MersenneTwister.bytesToInts(OUTPUT_1, 0, OUTPUT_1.length);
+
+ assertEquals(INPUT_1.length, output.length);
+ for(int i=0; i<INPUT_1.length; i++)
+ assertEquals(INPUT_1[i], output[i]);
}
public void testDouble() {
@@ -359,7 +373,7 @@
}
- public void testConsistencySeedFromInts() throws NoSuchAlgorithmException {
+ public void testConsistencySeedFromInts() throws NoSuchAlgorithmException,
UnsupportedEncodingException {
MessageDigest md = MessageDigest.getInstance("SHA-1");
MersenneTwister mt = new MersenneTwister(INT_SEED);
byte[] bytes = new byte[SEED_SIZE];
@@ -367,10 +381,10 @@
mt.nextBytes(bytes);
md.update(bytes);
- assertEquals(new String(EXPECTED_OUTPUT_MT_INTS), new String(md.digest()));
+ assertEquals(new String(EXPECTED_OUTPUT_MT_INTS, "UTF-8"), new
String(md.digest(), "UTF-8"));
}
- public void testConsistencySeedFromBytes() throws NoSuchAlgorithmException {
+ public void testConsistencySeedFromBytes() throws NoSuchAlgorithmException,
UnsupportedEncodingException {
MessageDigest md = MessageDigest.getInstance("SHA-1");
MersenneTwister mt = new MersenneTwister(BYTE_SEED);
byte[] bytes = new byte[SEED_SIZE];
@@ -378,10 +392,10 @@
mt.nextBytes(bytes);
md.update(bytes);
- assertEquals(new String(EXPECTED_OUTPUT_MT_BYTES), new
String(md.digest()));
+ assertEquals(new String(EXPECTED_OUTPUT_MT_BYTES, "UTF-8"), new
String(md.digest(), "UTF-8"));
}
- public void testConsistencySeedFromInteger() throws NoSuchAlgorithmException
{
+ public void testConsistencySeedFromInteger() throws
NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest md = MessageDigest.getInstance("SHA-1");
MersenneTwister mt = new MersenneTwister(Integer.MAX_VALUE);
byte[] bytes = new byte[SEED_SIZE];
@@ -389,10 +403,10 @@
mt.nextBytes(bytes);
md.update(bytes);
- assertEquals(new String(EXPECTED_OUTPUT_MT_INT), new String(md.digest()));
+ assertEquals(new String(EXPECTED_OUTPUT_MT_INT, "UTF-8"), new
String(md.digest(), "UTF-8"));
}
- public void testConsistencySeedFromLong() throws NoSuchAlgorithmException {
+ public void testConsistencySeedFromLong() throws NoSuchAlgorithmException,
UnsupportedEncodingException {
MessageDigest md = MessageDigest.getInstance("SHA-1");
MersenneTwister mt = new MersenneTwister(Long.MAX_VALUE);
byte[] bytes = new byte[SEED_SIZE];
@@ -400,7 +414,7 @@
mt.nextBytes(bytes);
md.update(bytes);
- assertEquals(new String(EXPECTED_OUTPUT_MT_LONG), new String(md.digest()));
+ assertEquals(new String(EXPECTED_OUTPUT_MT_LONG, "UTF-8"), new
String(md.digest(), "UTF-8"));
}
public static Test suite() {
_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs