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

Reply via email to