C++ 生成UUID

C++创建UUID的两种方法:

std::string newGUID()
{
	char buf[50];
	memset(buf, 0, sizeof(buf));
	GUID guid;
	if (S_OK == ::CoCreateGuid(&guid)) {
		sprintf_s(buf, 50, "{%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}"
			, guid.Data1
			, guid.Data2
			, guid.Data3
			, guid.Data4[0], guid.Data4[1]
			, guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5]
			, guid.Data4[6], guid.Data4[7]);
	}
	return std::string(buf);
}

使用BOOST的话:

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>  
#include <boost/lexical_cast.hpp>

std::string getUUID()
{
	boost::uuids::random_generator rgen;						//随机生成器  
	boost::uuids::uuid a_uuid = rgen();							//生成一个随机的UUID  
	std::string str = boost::lexical_cast<std::string>(a_uuid); //uuid转换到字符串
	return str;
}

C++11多线程学习3 : join和detach

在上一篇文章C++11多线程学习1中的代码,我们使用了join。但是其实使用detach也是一样的结果。

int _tmain(int argc, _TCHAR* argv[])
{
	std::thread t1(test, "t1", 1000);
	std::thread t2(test, "t2", 1500);
	t1.join(); // detach()
	t2.join(); // detach()

	char ch;
	std::cin >> ch;
	return 0;
}

无论是join和detach其结果都是: 结果2

但是如果换成这份代码,结果就不同了。

C++11多线程学习2 : 类

C++11多线程学习1中,使用的函数是全局函数。

如果换成类函数又怎么样呢?

看下面的例子:

#include <iostream>
#include <windows.h>
#include <thread>

class test
{
public:
	test() {}
	~test() {}

public:
	void testcout(const std::string& str, int time)
	{
		for (int i = 0; i < 10; i++)
		{
			Sleep(time);
			std::cout << str.c_str() << i << std::endl;
		}
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	test te;
	std::thread t1(&test::testcout, te, "t1", 1000);
	std::thread t2(&test::testcout, te, "t2", 1300);
	t1.join();
	t2.join();

	char ch;
	std::cin >> ch;
	return 0;
}

运行结果依旧如下: 结果1

C++11多线程学习1 : 初识

最近开始学习新的知识啦,哈哈。

C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API。

如今就可以统一使用C++11的std::thread来处理了。

身份证号码验证算法

18身份证号码的结构

公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。

排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。

如何成长?

每每看到大家迷茫的眼神,漫无目的的行为时,心里总是有点刺痛,我也从迷茫一路走来,一直在改进自己。

现在,我有些类似强迫自己写下这篇文章,希望能尽可能地把心里真实的想法写出来,希望能给迷茫中的你一点帮助,哪怕只是一点,我也会很欣慰。

ConcurrentDictionary 对决 Dictionary+Locking

在 .NET 4.0 之前,如果我们需要在多线程环境下使用 Dictionary 类,除了自己实现线程同步来保证线程安全之外,我们没有其他选择。

很多开发人员肯定都实现过类似的线程安全方案,可能是通过创建全新的线程安全的字典类型,或者仅是简单的用一个类封装一个 Dictionary 对象,并在所有方法中加上锁机制,我们称这种方案叫“Dictionary + Locks”。

我听到过的最精彩的一个软件纠错故事

那还是80年代初期,我爸爸在一家存储设备公司工作,这个公司现在已经不存在了,它生产磁带机和驱动这些磁带高速运转的气动系统 —— 这是那个时代的产物。

C++ do-while(0)宏

虽然我们不建议使用宏,但是,作为一个语言特性,有时宏是不可避免的。对于这种情况,正确使用宏尤其重要。它可以帮助你减少很多重复性工作。但是,如果你没有仔细地定义,宏绝对能把你逼疯。在很多 C/C++ 程序中,你会看到类似如下定义的宏:

一次皆大欢喜的跳槽调薪

我的朋友A君是个典型的.NET开发人员,技术不错,人品也不错,在一家小公司(姑且称为甲公司)做项目开发,是技术骨干。

3个月前,他找到我说想跳槽,让我帮忙介绍工作。我说为什么想跳了?