我想生成随机的UUID,因为对于我的程序中的实例而言,它具有唯一标识符非常重要.我查看了Boost UUID,但我无法生成UUID,因为我不明白要使用哪个类和方法.
如果有人能给我任何如何实现这一目标的例子,我将不胜感激.
当我使用单线程生成随机数时,4M uuids中没有重复生成,但如果我生成两个线程,每个1M,我看到大约16-20个重复.可能是什么原因?
class TestUuid
{
public:
std::string GenerateUUid(){
boost::uuids::uuid uid;
{
boost::mutex::scoped_lock(m_mRandomGen);
uid = m_oRandomGen();
}
std::stringstream ss;
ss << uid;
return ss.str();
}
void TestUid(std::map<std::string, unsigned>& mUids, unsigned count){
for(unsigned i = 0; i < count; ++i) {
std::string sUid = GenerateUUid();
std::map<std::string, unsigned>::const_iterator it = mUids.find(sUid);
if(it == mUids.end()){
mUids[sUid] = i;
}else {
std::cerr << "Duplicate uid:" << sUid << " found in thread id:" << pthread_self() << ", counter:" << i << ", earlier counter:" << …Run Code Online (Sandbox Code Playgroud) 我在Mac OS X上使用clang(CXX ='clang ++ -std = c ++ 11 -stdlib = libc ++'),增强1.53.0.
我想在unordered_map中使用uuid作为键,但是会出现以下错误:
/usr/bin/../lib/c++/v1/type_traits:748:38: error: implicit instantiation of undefined template
'std::__1::hash<boost::uuids::uuid>'
: public integral_constant<bool, __is_empty(_Tp)> {};
^
/usr/bin/../lib/c++/v1/unordered_map:327:54: note: in instantiation of template class
'std::__1::is_empty<std::__1::hash<boost::uuids::uuid> >' requested here
template <class _Key, class _Tp, class _Hash, bool = is_empty<_Hash>::value
Run Code Online (Sandbox Code Playgroud)
...
/usr/bin/../lib/c++/v1/unordered_map:327:71: error: no member named 'value' in
'std::__1::is_empty<std::__1::hash<boost::uuids::uuid> >'
template <class _Key, class _Tp, class _Hash, bool = is_empty<_Hash>::value
~~~~~~~~~~~~~~~~~^
Run Code Online (Sandbox Code Playgroud)
...
它是什么 - Boost中的一个错误,它使它与我的C++ lib不兼容?或者我做错了什么?任何解决方法?
考虑使用g++ -std=c++11(GCC 4.7.2)编译此函数:
boost::uuids::uuid getID()
{
static boost::uuids::random_generator generator;
return generator();
}
Run Code Online (Sandbox Code Playgroud)
getID从多个线程调用安全吗?
正如提到这里的局部静态对象定义在所述第一线是根据C ++ 11标准线程安全的。问题是,第二行boost::uuids::random_generator::operator()对同一对象的调用generator是否也是线程安全的。返回的UUID在单个线程中是否唯一?
我想检查给定的字符串是否是使用boost的有效UUID.
这是我通过查看boost网站上的文档得出的:
void validate_uuid(const std::string& value)
{
try
{
boost::uuids::string_generator stringGenerator;
(void)stringGenerator(value);
}
catch (const std::exception& ex)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这并不总是有效.
如果我使用对于有效UUID而言太短的字符串调用该函数,则会按预期抛出异常.但是如果我用无效的UUID调用该函数(例如00000000-0000-0000-0000-00000000000K),则不会抛出任何异常.
有人可以澄清为什么会这样.
另外,我已经看到使用boost :: lexical_cast将字符串读取为此处发布的UUID .我想知道我是否应该采用这种方法.任何建议表示赞赏
我刚刚开始在c ++中使用boost,我只想问一些与uuids有关的问题.
我正在加载一个文件,要求我知道uuids所以我可以将一些对象链接在一起.出于这个原因,我正在尝试编写自己的uuids,但我不确定字符串是否有任何特殊条件,因为我一直在使用的字符串(通常是基本字符串)不起作用.谁能指出我正确的方向?我已经尝试过使用字符串生成器,但到目前为止无济于事,所以我假设我的字符串出现了问题(目前只是随机字样).
这是一个简短的例子,不能给出真正的代码:
void loadFiles(std::string xmlFile);
void linkObjects(custObj network)
{
for (int i = 0; i < network->getLength(); i++)
{
network[i]->setId([boost::uuid]);
if (i > 0)
network[i]->addObj(network[i-1]->getId());
}
}
Run Code Online (Sandbox Code Playgroud) 我有这个代码基于SO中的几个帖子:
boost::uuids::uuid uuid = boost::uuids::random_generator()();
auto uuidString= boost::lexical_cast<std::string>(uuid);
Run Code Online (Sandbox Code Playgroud)
但是当我编译这段代码时,我收到了这个错误:
Source type is neither std::ostream`able nor std::wostream`able C:\Local\boost\boost\lexical_cast\detail\converter_lexical.hpp
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误?
我有一个成员班:
std::string mName;
boost::uuids::uuid mId;
Run Code Online (Sandbox Code Playgroud)
在我写的构造函数中:
mName = boost::lexical_cast<std::string>(mId);
Run Code Online (Sandbox Code Playgroud)
Valgrind写道:
==30714== Use of uninitialised value of size 8
==30714== at 0x69E92FC: ??? (in /usr/lib/libstdc++.so.6.0.16)
==30714== by 0x69E93EE: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<unsigned long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, unsigned long) const (in /usr/lib/libstdc++.so.6.0.16)
==30714== by 0x69E9705: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, unsigned long) const (in /usr/lib/libstdc++.so.6.0.16)
==30714== by 0x69F522C: std::ostream& std::ostream::_M_insert<unsigned long>(unsigned long) (in /usr/lib/libstdc++.so.6.0.16)
==30714== by 0x6283A5: std::basic_ostream<char, std::char_traits<char> >& boost::uuids::operator<< <char, std::char_traits<char> …Run Code Online (Sandbox Code Playgroud) 尝试序列化此简单类:
class Data
{
public:
Data();
Data(boost::uuids::uuid id);
Data(const Data&) = delete;
Data& operator=(const Data&) = delete;
inline boost::uuids::uuid getGuid() { return guid; }
template <class Archive>
void serialize(Archive & ar)
{
ar(guid);
}
private:
boost::uuids::uuid guid;
};
Run Code Online (Sandbox Code Playgroud)
但我收到此错误消息
error C2338: Trying to serialize an unserializable type with an output archive.
Run Code Online (Sandbox Code Playgroud)
潜伏到uuid。实现此目的的Boost序列化方法是添加
#include <boost/uuid/uuid_serialize.hpp>
Run Code Online (Sandbox Code Playgroud)
但这不适用于开箱即用的谷物。谷物文件说
谷物存档在std :: ostream或std :: istream对象上运行。
所以我尝试在已定义但没有运气的地方添加标题
#include <boost/uuid/uuid_io.hpp>
Run Code Online (Sandbox Code Playgroud) 我正在使用boost uuid来生成会话ID.
std::string SessionGenerator::generate()
{
boost::uuids::uuid id = m_rgen();
m_ss.clear();
m_ss.str("");
m_ss << id;
return m_ss.str();
}
Run Code Online (Sandbox Code Playgroud)
假设我永远不会得到重复或者我应该对活动会话进行检查是否安全?
谢谢
boost-uuid ×10
boost ×9
c++ ×9
uuid ×4
boost-random ×1
c++11 ×1
cereal ×1
clang ×1
gcc4.7 ×1
lexical-cast ×1
string ×1
valgrind ×1