diff --git a/btpd/btpd.c b/btpd/btpd.c
index 67419ed..b68439c 100644
--- a/btpd/btpd.c
+++ b/btpd/btpd.c
@@ -1,7 +1,7 @@
 #include "btpd.h"
 
+#include <openssl/sha.h>
 #include <signal.h>
-#include <time.h>
 
 static uint8_t m_peer_id[20];
 static struct event m_sigint;
@@ -80,12 +80,25 @@ void ipc_init(void);
 void
 btpd_init(void)
 {
-    srandom(time(NULL));
-
+    unsigned long seed;
+    uint8_t idcon[1024];
+    struct timeval now;
+    int n;
+
+    gettimeofday(&now, NULL);
+    n = snprintf(idcon, sizeof(idcon), "%ld%ld%d", now.tv_sec, now.tv_usec,
+        net_port);
+    if (n < sizeof(idcon))
+        gethostname(idcon + n, sizeof(idcon) - n);
+    idcon[sizeof(idcon) - 1] = '\0';
+    n = strlen(idcon);
+
+    SHA1(idcon, n, m_peer_id);
+    bcopy(m_peer_id, &seed, sizeof(seed));
     bcopy(BTPD_VERSION, m_peer_id, sizeof(BTPD_VERSION) - 1);
     m_peer_id[sizeof(BTPD_VERSION) - 1] = '|';
-    for (int i = sizeof(BTPD_VERSION); i < 20; i++)
-        m_peer_id[i] = rand_between(0, 255);
+
+    srandom(seed);
 
     net_init();
     ipc_init();