JAVA-1777: Backport JAVA-444 to 3.0.x (#970)
diff --git a/changelog/README.md b/changelog/README.md
index b8266ac..1ffb16b 100644
--- a/changelog/README.md
+++ b/changelog/README.md
@@ -1,9 +1,10 @@
 ## Changelog
 
-### 3.0.8 (in progress)
+### 3.0.8
 
 - [bug] JAVA-1404: Fix min token handling in TokenRange.contains.
 - [bug] JAVA-1429: Prevent heartbeats until connection is fully initialized.
+- [bug] JAVA-1777: Add Java process information to UUIDs.makeNode() hash.
 
 
 ### 3.0.7
diff --git a/driver-core/src/main/java/com/datastax/driver/core/utils/UUIDs.java b/driver-core/src/main/java/com/datastax/driver/core/utils/UUIDs.java
index b53cb6b..861ca08 100644
--- a/driver-core/src/main/java/com/datastax/driver/core/utils/UUIDs.java
+++ b/driver-core/src/main/java/com/datastax/driver/core/utils/UUIDs.java
@@ -16,7 +16,10 @@
 package com.datastax.driver.core.utils;
 
 import com.google.common.base.Charsets;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import java.lang.management.ManagementFactory;
 import java.net.InetAddress;
 import java.net.NetworkInterface;
 import java.net.SocketException;
@@ -32,6 +35,13 @@
  */
 public final class UUIDs {
 
+    /**
+     * The System property to use to force the value of the process ID (PID).
+     */
+    public static final String PID_SYSTEM_PROPERTY = "com.datastax.driver.PID";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(UUIDs.class);
+
     private UUIDs() {
     }
 
@@ -92,6 +102,7 @@
             update(digest, props.getProperty("os.arch"));
             update(digest, props.getProperty("os.name"));
             update(digest, props.getProperty("os.version"));
+            update(digest, getProcessPiece());
 
             byte[] hash = digest.digest();
 
@@ -106,6 +117,35 @@
         }
     }
 
+    private static String getProcessPiece() {
+        Integer pid = null;
+        String pidProperty = System.getProperty(PID_SYSTEM_PROPERTY);
+        if (pidProperty != null) {
+            try {
+                pid = Integer.parseInt(pidProperty);
+                LOGGER.info("PID obtained from System property {}: {}", PID_SYSTEM_PROPERTY, pid);
+            } catch (NumberFormatException e) {
+                LOGGER.warn("Incorrect integer specified for PID in System property {}: {}", PID_SYSTEM_PROPERTY, pidProperty);
+            }
+        }
+        if (pid == null) {
+            try {
+                String pidJmx = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
+                pid = Integer.parseInt(pidJmx);
+                LOGGER.info("PID obtained through JMX: {}", pid);
+            } catch (Exception e) {
+                LOGGER.warn("Failed to obtain PID from JMX", e);
+            }
+        }
+        if (pid == null) {
+            pid = new java.util.Random().nextInt();
+            LOGGER.warn("Could not determine PID, falling back to a random integer: {}", pid);
+        }
+        ClassLoader loader = UUIDs.class.getClassLoader();
+        int loaderId = loader != null ? System.identityHashCode(loader) : 0;
+        return Integer.toHexString(pid) + Integer.toHexString(loaderId);
+    }
+
     private static void update(MessageDigest digest, String value) {
         if (value != null)
             digest.update(value.getBytes(Charsets.UTF_8));