mirror of
https://github.com/rakshasa/rtorrent.git
synced 2026-10-10 16:19:23 +00:00
Switch to C++11 MRT RNG for random bytes
Switching to a better RNG for generating strings will prevent the common peerID collisions the rTorrent client has been seeing for YEARS in #440 and #318.
This commit is contained in:
+54
-3
@@ -39,9 +39,13 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
|
#include <climits>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <functional>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <locale>
|
#include <locale>
|
||||||
|
#include <random>
|
||||||
|
|
||||||
|
|
||||||
namespace rak {
|
namespace rak {
|
||||||
|
|
||||||
@@ -312,11 +316,13 @@ transform_hex_str(const Sequence& seq) {
|
|||||||
template <typename Sequence>
|
template <typename Sequence>
|
||||||
Sequence
|
Sequence
|
||||||
generate_random(size_t length) {
|
generate_random(size_t length) {
|
||||||
|
std::random_device rd;
|
||||||
|
std::mt19937 mt(rd());
|
||||||
|
using bytes_randomizer = std::independent_bits_engine<std::mt19937, CHAR_BIT, uint8_t>;
|
||||||
|
bytes_randomizer bytes(mt);
|
||||||
Sequence s;
|
Sequence s;
|
||||||
s.reserve(length);
|
s.reserve(length);
|
||||||
|
std::generate_n(std::back_inserter(s), length, std::ref(bytes));
|
||||||
std::generate_n(std::back_inserter(s), length, &::random);
|
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -371,6 +377,51 @@ is_all_name(const Sequence& src) {
|
|||||||
return is_all_name(src.begin(), src.end());
|
return is_all_name(src.begin(), src.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Iterator>
|
||||||
|
std::string
|
||||||
|
sanitize(Iterator first, Iterator last) {
|
||||||
|
std::string dest;
|
||||||
|
for (; first != last; ++first) {
|
||||||
|
if (std::isprint(*first) && *first != '\r' && *first != '\n' && *first != '\t')
|
||||||
|
dest += *first;
|
||||||
|
else
|
||||||
|
dest += " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Sequence>
|
||||||
|
std::string
|
||||||
|
sanitize(const Sequence& src) {
|
||||||
|
return trim(sanitize(src.begin(), src.end()));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Iterator>
|
||||||
|
std::string striptags(Iterator first, Iterator last) {
|
||||||
|
bool copychar = true;
|
||||||
|
std::string dest;
|
||||||
|
|
||||||
|
for (; first != last; ++first) {
|
||||||
|
if (std::isprint(*first) && *first == '<') {
|
||||||
|
copychar = false;
|
||||||
|
} else if (std::isprint(*first) && *first == '>') {
|
||||||
|
copychar = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (copychar)
|
||||||
|
dest += *first;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Sequence>
|
||||||
|
std::string striptags(const Sequence& src) {
|
||||||
|
return striptags(src.begin(), src.end());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user