diff --git a/boost/uuid/seed_rng.hpp b/boost/uuid/seed_rng.hpp
index 5f75d7b..63ee3e9 100644
--- a/boost/uuid/seed_rng.hpp
+++ b/boost/uuid/seed_rng.hpp
@@ -76,8 +76,14 @@ public:
 
 public:
     seed_rng()
-        : rd_index_(5)
+        : rd_index_(5),
+          random_(std::fopen( "/dev/urandom", "rb" ))
     {}
+    
+    ~seed_rng()
+    {
+        if(random_) std::fclose( random_ );
+    }
 
     result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const
     {
@@ -137,10 +143,9 @@ private:
         {
             unsigned char buffer[ 20 ];
 
-            if( std::FILE * f = std::fopen( "/dev/urandom", "rb" ) )
+            if( random_ )
             {
-                std::fread( buffer, 1, 20, f );
-                std::fclose( f );
+                std::fread( buffer, 1, 20, random_ );
             }
 
             // using an uninitialized buffer[] if fopen fails
@@ -173,6 +178,11 @@ private:
 private:
     unsigned int rd_[5];
     int rd_index_;
+    FILE* random_;
+    
+    // Make seed_rng uncopyable
+    seed_rng(seed_rng const&);
+    seed_rng& operator=(seed_rng const&);
 };
 
 // almost a copy of boost::generator_iterator
diff --git a/boost/uuid/uuid_generators.hpp b/boost/uuid/uuid_generators.hpp
index bab084c..4a8d06d 100644
--- a/boost/uuid/uuid_generators.hpp
+++ b/boost/uuid/uuid_generators.hpp
@@ -144,30 +144,24 @@ private:
     }
 
     unsigned char get_value(char c) const {
-        static char const digits[23] = "0123456789abcdefABCDEF";
-        static char const*const digits_end = digits+23;
+        char const*const digits = "0123456789abcdefABCDEF";
+        char const*const digits_end = digits+22;
         
-        unsigned char const values[23] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,10,11,12,13,14,15 };
-
-        char const* d = std::find(&digits[0], digits_end, c);
-        if (d == digits_end) {
-            return static_cast<unsigned char>(-1);
-        }
+        unsigned char const values[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,10,11,12,13,14,15,
+            static_cast<unsigned char>(-1) };
 
+        char const* d = std::find(digits, digits_end, c);
         return values[std::distance(digits, d)];
     }
 
     unsigned char get_value(wchar_t c) const {
-        static wchar_t const digits[23] = L"0123456789abcdefABCDEF";
-        static wchar_t const*const digits_end = digits+23;
+        wchar_t const*const digits = L"0123456789abcdefABCDEF";
+        wchar_t const*const digits_end = digits+22;
         
-        unsigned char const values[23] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,10,11,12,13,14,15 };
+        unsigned char const values[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,10,11,12,13,14,15,
+            static_cast<unsigned char>(-1) };
 
         wchar_t const* d = std::find(digits, digits_end, c);
-        if (d == digits_end) {
-            return static_cast<unsigned char>(-1);
-        }
-
         return values[std::distance(digits, d)];
     }
     
