diff --git a/XML/include/Poco/XML/NamePool.h b/XML/include/Poco/XML/NamePool.h index 426208c4a..79cf36b68 100644 --- a/XML/include/Poco/XML/NamePool.h +++ b/XML/include/Poco/XML/NamePool.h @@ -74,6 +74,7 @@ private: NamePoolItem* _pItems; unsigned long _size; + unsigned long _salt; int _rc; }; diff --git a/XML/src/NamePool.cpp b/XML/src/NamePool.cpp index 6553110c5..43e5f1824 100644 --- a/XML/src/NamePool.cpp +++ b/XML/src/NamePool.cpp @@ -16,6 +16,7 @@ #include "Poco/XML/NamePool.h" #include "Poco/Exception.h" +#include "Poco/Random.h" namespace Poco { @@ -62,11 +63,16 @@ private: NamePool::NamePool(unsigned long size): _size(size), + _salt(0), _rc(1) { poco_assert (size > 1); _pItems = new NamePoolItem[size]; + + Poco::Random rnd; + rnd.seed(); + _salt = rnd.next(); } @@ -92,7 +98,7 @@ void NamePool::release() const Name& NamePool::insert(const XMLString& qname, const XMLString& namespaceURI, const XMLString& localName) { unsigned long i = 0; - unsigned long n = hash(qname, namespaceURI, localName) % _size; + unsigned long n = (hash(qname, namespaceURI, localName) ^ _salt) % _size; while (!_pItems[n].set(qname, namespaceURI, localName) && i++ < _size) n = (n + 1) % _size;