8001033: Refactor network address handling in virtual machine identifiers
Reviewed-by: smarks, hawtin, mchung
This commit is contained in:
parent
ebbaaa0f18
commit
3cf0ad20be
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -25,10 +25,8 @@
|
|||||||
|
|
||||||
package java.rmi.dgc;
|
package java.rmi.dgc;
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
import java.net.*;
|
|
||||||
import java.rmi.server.UID;
|
import java.rmi.server.UID;
|
||||||
import java.security.*;
|
import java.security.SecureRandom;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A VMID is a identifier that is unique across all Java virtual
|
* A VMID is a identifier that is unique across all Java virtual
|
||||||
@ -39,9 +37,8 @@ import java.security.*;
|
|||||||
* @author Peter Jones
|
* @author Peter Jones
|
||||||
*/
|
*/
|
||||||
public final class VMID implements java.io.Serializable {
|
public final class VMID implements java.io.Serializable {
|
||||||
|
/** Array of bytes uniquely identifying this host */
|
||||||
/** array of bytes uniquely identifying this host */
|
private static final byte[] randomBytes;
|
||||||
private static byte[] localAddr = computeAddressHash();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @serial array of bytes uniquely identifying host created on
|
* @serial array of bytes uniquely identifying host created on
|
||||||
@ -56,6 +53,14 @@ public final class VMID implements java.io.Serializable {
|
|||||||
/** indicate compatibility with JDK 1.1.x version of class */
|
/** indicate compatibility with JDK 1.1.x version of class */
|
||||||
private static final long serialVersionUID = -538642295484486218L;
|
private static final long serialVersionUID = -538642295484486218L;
|
||||||
|
|
||||||
|
static {
|
||||||
|
// Generate 8 bytes of random data.
|
||||||
|
SecureRandom secureRandom = new SecureRandom();
|
||||||
|
byte bytes[] = new byte[8];
|
||||||
|
secureRandom.nextBytes(bytes);
|
||||||
|
randomBytes = bytes;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new VMID. Each new VMID returned from this constructor
|
* Create a new VMID. Each new VMID returned from this constructor
|
||||||
* is unique for all Java virtual machines under the following
|
* is unique for all Java virtual machines under the following
|
||||||
@ -65,7 +70,7 @@ public final class VMID implements java.io.Serializable {
|
|||||||
* for the lifetime of this object. <p>
|
* for the lifetime of this object. <p>
|
||||||
*/
|
*/
|
||||||
public VMID() {
|
public VMID() {
|
||||||
addr = localAddr;
|
addr = randomBytes;
|
||||||
uid = new UID();
|
uid = new UID();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,52 +131,4 @@ public final class VMID implements java.io.Serializable {
|
|||||||
result.append(uid.toString());
|
result.append(uid.toString());
|
||||||
return result.toString();
|
return result.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Compute the hash an IP address. The hash is the first 8 bytes
|
|
||||||
* of the SHA digest of the IP address.
|
|
||||||
*/
|
|
||||||
private static byte[] computeAddressHash() {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the local host's IP address.
|
|
||||||
*/
|
|
||||||
byte[] addr = java.security.AccessController.doPrivileged(
|
|
||||||
new PrivilegedAction<byte[]>() {
|
|
||||||
public byte[] run() {
|
|
||||||
try {
|
|
||||||
return InetAddress.getLocalHost().getAddress();
|
|
||||||
} catch (Exception e) {
|
|
||||||
}
|
|
||||||
return new byte[] { 0, 0, 0, 0 };
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
byte[] addrHash;
|
|
||||||
final int ADDR_HASH_LENGTH = 8;
|
|
||||||
|
|
||||||
try {
|
|
||||||
/*
|
|
||||||
* Calculate message digest of IP address using SHA.
|
|
||||||
*/
|
|
||||||
MessageDigest md = MessageDigest.getInstance("SHA");
|
|
||||||
ByteArrayOutputStream sink = new ByteArrayOutputStream(64);
|
|
||||||
DataOutputStream out = new DataOutputStream(
|
|
||||||
new DigestOutputStream(sink, md));
|
|
||||||
out.write(addr, 0, addr.length);
|
|
||||||
out.flush();
|
|
||||||
|
|
||||||
byte digest[] = md.digest();
|
|
||||||
int hashlength = Math.min(ADDR_HASH_LENGTH, digest.length);
|
|
||||||
addrHash = new byte[hashlength];
|
|
||||||
System.arraycopy(digest, 0, addrHash, 0, hashlength);
|
|
||||||
|
|
||||||
} catch (IOException ignore) {
|
|
||||||
/* can't happen, but be deterministic anyway. */
|
|
||||||
addrHash = new byte[0];
|
|
||||||
} catch (NoSuchAlgorithmException complain) {
|
|
||||||
throw new InternalError(complain.toString(), complain);
|
|
||||||
}
|
|
||||||
return addrHash;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user