还是要看实际情况,并不是任何时候都可以用全局变量替代单例的。
如在Symbian C++ S60V3以前,是不允许WSD数据(全局变量)存在的,这种情况下必须用Tls Singleton这样的模式。。。
re: loki技法(1).静态断言 蚂蚁终结者 2010-04-10 13:06
见过另外一种比较简洁的实现:
#define static_assert(expr) typedef char __static_assert__[(expr) ? 1 : -1];
如:
static_assert(sizeof(int) == 1);
编译错误为:"the size of an array must be greater than zero"
不过不能够像上面那样用msg自定义错误信息!
re: 实用编译器构建指南(一) 蚂蚁终结者 2009-12-10 09:37
不错,多谢分享,期待后续内容!
re: strlen源码剖析 蚂蚁终结者 2009-06-08 11:51
@宋兵乙
“由于char_ptr是指向char的指针,因此每次++应该是增加一个char的长度就是8”
看来你对指针运算还不太了解,建议好好复习一下指针部分。
授人鱼不如授人渔呵呵
至于生命周期,大可不必用RANDOM_VAR这种方式,还是建议看一下BOOST_FOREACH
re: MD5算法的C++实现 蚂蚁终结者 2009-04-27 23:03
@MM
你是要计算纯数据的md5值?
那可以用这个重载方法:
void update(const void* input, size_t length);
比如:
1.计算一个int的md5值:
int i = 12345;
MD5 md;
md.update(&i, sizeof(i));
cout << md.toString() << endl;
2.计算一个struct的md5值:
struct Package {
char buffer[32];
int i;
//...
};
Package pkg;
MD5 md;
md.update(&pkg, sizeof(pkg));
cout << md.toString() << endl;
不知道这是否是你想要的功能?
re: C++&Win32写的空当接龙 蚂蚁终结者 2009-04-16 19:32
@sevenxz
晕。。。
其实上面就有下载链接!
re: MD5算法的C++实现 蚂蚁终结者 2009-04-16 16:31
@csu_boy
这个应该是跟计算md5值的软件实现有关,一般来说都只看文件内容,内容相同的文件md5就是一样的
re: MD5算法的C++实现 蚂蚁终结者 2009-04-08 11:52
@csu_boy
这个是Endian的问题,本文中md5的实现是基于Little Endian的机器,所以要写成下面这样:
_state[0] = 0x67452301;
_state[1] = 0xefcdab89;
_state[2] = 0x98badcfe;
_state[3] = 0x10325476;
如果是Big Endian的机器,则要写成:
_state[0] = 0x01234567;
_state[1] = 0x89abcdef;
_state[2] = 0xfedcba98;
_state[3] = 0x76543210;
re: MD5算法的C++实现 蚂蚁终结者 2009-04-05 17:29
调用update是有累加效果的,上面的代码:
...
md5.update(str1);
...
md5.update(str2);
实际上得到的是"abcdefghijklmnabcdefghijklmn"的md5值
如果想重复使用某个MD5对象,需要在下次update前先reset,如下:
...
string str2 = str1 ;
//这里加上reset
md5.reset();
md5.update(str2);
...
re: MD5算法的C++实现 蚂蚁终结者 2009-03-07 11:56
@chang
16位系统下应该可以拿上面的代码移植,比如需要把md5.h中的
typedef unsigned int uint32;
改为
typedef unsigned long uint32;
可能还需要改动其他代码,我这里没有条件测试,你不妨测试一下。
update是唯一的接口,不调用是不行的呵呵。
re: MD5算法的C++实现 蚂蚁终结者 2009-02-23 20:01
@roger
呵呵,哥们说笑了,不收费,若是觉得不错的话直接用就行了!
re: MD5算法的C++实现 蚂蚁终结者 2009-02-23 11:38
@凉风
md5算法是一种hash算法,是单向的,还原是不可能的。因为多份数据可能计算出相同的md5值。
re: MD5算法的C++实现 蚂蚁终结者 2009-02-20 12:40
@Nihlathak
当文件不存在的时候得到的结果肯定是错误的。
上面的例子写成那样只是为了演示用法。
最好在调用update前判断一下文件是否存在:
md5.reset();
ifstream file("E:\\1.txt");
if (!file) {
// error: can not open file
}
else {
md5.update();
PrintMD5("E:\\1.txt", md5);
}
re: MD5算法的C++实现 蚂蚁终结者 2009-02-02 09:07
我这里是原创呵呵,不过不知道你说的make文件是什么?我这里好像没有
re: MD5算法的C++实现 蚂蚁终结者 2009-01-08 13:15
@far
其实最简单方法就是修改ABCD的初始值,哪怕只是修改其中一位数,得到的md5值也会跟标准的完全不一样。因为md5算法的整个过程都是以ABCD这4个数为基础。
re: TEA加密算法的C/C++实现 蚂蚁终结者 2008-12-12 17:43
@ghbxx
我当时写这篇文章的时候是可以的,可能现在QQ协议又变了
8 using namespace vl;
9 using namespace vl::platform;
10 using namespace vl::stream;
11 using namespace vl::system;
12 using namespace vl::system::synchronization;
13 using namespace vl::serialization;
14 using namespace vl::commondata;
15 using namespace vl::communication;
居然都是自己封装的。。。难道是想模拟C#
re: 昨天 蚂蚁终结者 2008-11-17 23:27
太有感触了,美好的童年啊!
奔3了,一样不得不去奔波,很无奈!
呵呵,最后几分钟居然还是千与千寻里的Always with me
呵呵,没用过,看起来好像很复杂,一直用自己写的一个通用的makefile模板。有点害怕这些东西,当时看makefile的manual有阴影了。
re: 代码的坏味 蚂蚁终结者 2008-11-15 13:23
呵呵,AutoLock这种构造时lock,析构时unlock的方法其实很好么,boost::scoped_lock就是这样的。个人觉得括号其实无所谓,至少这种方法比手动lock,unlock要优雅很多,在异常安全方面也有保证。
@OwnWaterloo
建议:
1.单下划线开始的标识符?
这个是编程风格问题,很难说出哪个更好哪个更差,正所谓萝卜白菜各有所爱,个人认为成员变量无论是下划线开始(如:_handle)还是下划线结尾(如:handle_),又或者是用匈牙利命名法,只要在编码中始终保持一种风格就好。编码风格对程序员来说可能是一种信仰。
2.将windows.h 从thread.h中移走
这个确实是可以考虑,如果考虑到跨平台的话。
疑问:
1. Thread的析构
据我所知,join应该是等待线程结束的惯用法,Java.Thread,boost.Thread都通过join来保证线程的安全结束。是否是规范我也不清楚,貌似join是POSIX中线程取消规范中的一个?
2.Thread 似乎并不需要从 Runable 继承
是不需要继承Runnable的,这样只是模仿Java的行为。
@Robinfoxnan
OwnWaterloo回答的也是我想回答的,我就不多说了。
re: 开篇 by PureMilk(王婷婷) 蚂蚁终结者 2008-10-09 18:00
悄悄地路过。。。加油!
re: MD5算法的C++实现 蚂蚁终结者 2008-10-09 16:10
@ktls
不客气,很多人用的时候都有这个问题,在这里弄清楚了免得后面的人再走弯路!
re: MD5算法的C++实现 蚂蚁终结者 2008-10-09 15:49
@ktls
md5.update(ifstream("C:\\abc.doc"));
刚才没注意到,ifstream默认是以文本模式打开的,改成二进制应该就可以了:
md5.update(ifstream("C:\\abc.doc", ios::binary));
re: MD5算法的C++实现 蚂蚁终结者 2008-10-09 15:45
@ktls
email:antterminator@gmail.com
msn:antterminator@hotmail.com
这样的话可能是其它的问题,那把abc.doc发给我测试下吧。
这个本来是考虑跨平台使用的,如果做成dll就只能windows用了。
re: MD5算法的C++实现 蚂蚁终结者 2008-10-09 15:41
@wx3456
有几个地方我不太清楚,首先049ec6b8b8565dfde2007f7a9f7ecd84是什么密码加密出来的?还有1234的md5应该是81dc9bdb52d04dc20036dbd8313ed055才对。如果方便的话把源码发我帮你看看,你有msn没有?有的话加我antterminator@hotmail.com
re: MD5算法的C++实现 蚂蚁终结者 2008-10-09 14:11
@ktls
这个我测试过很多次了,肯定是没有问题的!
可能是你哪个地方弄错了!
re: MD5算法的C++实现 蚂蚁终结者 2008-10-08 16:17
@foxtail
这个是没有问题的,参考下上面我回答的:
@gg
其实具体的用法在源代码的main函数中已经演示得很清楚了,我想你也肯定没有看文章后面的:“2.计算文件的MD5值”这一段,专门计算md5值的软件如WinMD5是以二进制形式打开文件的,所以:
string s1 = MD5(ifstream("file")).toString();
string s2 = MD5(ifstream("file", ios::binary)).toString();
s1与s2是不一样的,前一个是以文本模式打开,后一个是以二进制模式打开。
re: MD5算法的C++实现 蚂蚁终结者 2008-10-08 15:30
@wx3456
呵呵,前辈不敢当,我大学刚毕业工作才几个月而已。目前从事C++方面的工作,有空多交流。
re: MD5算法的C++实现 蚂蚁终结者 2008-10-08 15:06
@wx3456
既然MD5是单向的,那你可以换一种方式:
在用户登录时,计算用户输入的密码的MD5值,拿这个值和ini文件里的MD5比较,如果相等就允许登录(虽然多个不同的密码可能对应相同的MD5值,但是几率可以说非常小,对于一般的应用来说足够了)。
比如用户A注册时的密码为abc,计算MD5值保存在ini文件为:
900150983cd24fb0d6963f7d28e17f72
在用户A登录时,假设用户输入的密码为xxx,则计算xxx的MD5值,若和ini文件中的MD5值相等就允许登录。
re: MD5算法的C++实现 蚂蚁终结者 2008-10-08 14:28
@wx3456
不好意思,我不太明白你说的“MD5字符解密”是什么意思?
MD5是单向的,是没有办法从MD5值推算出原先的信息的。
从string值转换成CString很简单,google一下有很多。
re: strlen源码剖析 蚂蚁终结者 2008-09-07 19:54
@star
欢迎转载,转载当然是没有问题的,毕竟写文章就是能让更多的人看到!
为什么不一次就移32位呢?
我也不太清楚,可能就其中注释所说:
/* Do the shift in two steps to avoid a warning if long has 32 bits. */
只是为了避免warn吧呵呵!
re: MD5算法的C++实现 蚂蚁终结者 2008-09-01 19:38
@zhongyunde
代码没有问题,可以放心使用!
re: MD5算法的C++实现 蚂蚁终结者 2008-08-19 10:12
@zhengdu
你用的是哪个版本的VC ?VC6.0 ?
大概是你的编译器太老,不支持static const整形值的初始化语法,试试下面两种办法:
1. 将md5.h中的
static const size_t BUFFER_SIZE = 1024;
改为
enum { BUFFER_SIZE = 1024 };
2. 将md5.h中的
static const size_t BUFFER_SIZE = 1024;
改为
static const size_t BUFFER_SIZE;
并在md5.cpp的
MD5::MD5() {
reset();
}
上面加上
const size_t MD5::BUFFER_SIZE = 1024;
re: MD5算法的C++实现 蚂蚁终结者 2008-06-23 22:03
@CPPLearning
谢谢提醒,是我的疏忽呵呵!
@sodar
能说下在动态库工程中使用Singleton的具体需求吗?dll中用atexit注册的函数在FreeLibrary的时候会被调用,可以保证Singleton安全析构。
作为库函数效率还是比简洁重要,建议看下VC CRT的汇编代码。
很不错,能不能帮忙发个源代码,非常感谢!!!
antterminator@gmail.com
re: MD5算法的C++实现 蚂蚁终结者 2008-03-14 09:14
@gg
其实具体的用法在源代码的main函数中已经演示得很清楚了,我想你也肯定没有看文章后面的:“2.计算文件的MD5值”这一段,专门计算md5值的软件如WinMD5是以二进制形式打开文件的,所以:
string s1 = MD5(ifstream("file")).toString();
string s2 = MD5(ifstream("file", ios::binary)).toString();
s1与s2是不一样的,前一个是以文本模式打开,后一个是以二进制模式打开。
re: 单件模式的实现 蚂蚁终结者 2008-03-02 21:37
singleton远没有想象的那么简单!
re: C++&Win32写的空当接龙 蚂蚁终结者 2008-02-24 15:24
呵呵,源代码在上面就有下载啊!
re: 对07年的总结,对08年的期望 蚂蚁终结者 2008-01-01 15:47
不错,真心支持。祝早日写出一套engine