DongHao: 09 2007存档
片中一一演示了苏-35的雷达、发动机、机载导弹等,其中的作战模拟有点夸张,但也算是清楚明白。里面扮演反方的轰炸机很像B-52,估计俄罗斯人天生就恨西方的轰炸机 :)
毫无疑问,好的宣传片必须有好的音乐(我向来看重这一点),这一部宣传片也不例外:片中音乐强劲且带有金属质感,简直和苏-35战斗机一样。
可惜里面花大量时间演示了远程攻击,最精彩的近程格斗只show了一个“眼镜蛇”动作。
hero:什么?!
haodong:我的网站最近流量在跌!
hero:什么?!
haodong:....什么?!
bihong同学:....
阿龙:(问hero)好卖吗?....
奇怪的是:bdb使用Hash索引比使用btree索引慢了三倍多!难道是Hash算法做的太差?不太可能吧....
还特别发现了两个BerkeleyDB的工具db_load和db_dump,使用非常简便:
db_dump url.bdb > url.dat //从bdb导出为明文数据到url.dat
db_load -f url.dat url_new.bdb //从明文数据(必须是db_dump导出的格式)导入为bdb
结果重新load的bdb变为原来bdb的三分之一大小了,仔细一看数据并没有变化,看来立中同志说的“BerkeleyDB为了快速写硬盘采用了比较浪费的格式,文件撑到了一定程度需要整理”非常正确,而这个dump&load也算是个离线整理数据的好办法。
//Mutex.h class Mutex { public: Mutex(int resouce); //.... }; //Thread.h class Thread { public: void run(void) { //.... } private: Mutex m_mutex; }; int main(void) { Thread thr; }这段代码用 gcc 3.4.6 编译后产生的编译错误提示是:
test.cpp: In function `int main()':
test.cpp:25: error: no matching function for call to `Thread::Thread()'
test.cpp:12: note: candidates are: Thread::Thread(const Thread&)
*** Error code 1
乍一看还以为是Thread的构造函数不对,找了半天才发现是m_mutex做为Thread的成员变量必须在Thread的构造中掉用自身的构造函数Mutex(int resouce) 。我的文件可不像这段代码这样明显,它们分散在好几个文件里,结果这个编译提示造成了极大的困惑。以后要小心编译器的误导。
不过,编译器也并没有说错,确实可以直接用Thread的拷贝构造函数来创建一个新的Thread实例,gcc只是做了一件它认为正确的事而已....
Kimi:你不算,人家余斯恒才是一个引擎
hero:他算什么引擎,人肉引擎而已了——“肉擎”
大家:肉禽?......
《黑名单》里的主角经常是一副坏坏的笑容,颇为可爱,片中他的遭遇虽然郁闷,但情节和话外音却轻松而调侃,可谓“举重若轻”,相比《越狱》的一团黑暗一团压抑,感觉上要舒服得多。更重要的是《黑名单》每一集剧情都相对独立,干净俐落,是不可多得的好片。
推荐!
自从96年爬金鼎山之后,再没有来过风景这么“南方”的山了,不过寿仙谷毕竟太小,一个小时就爬了个遍。金鼎山我可是花了六个小时才爬上顶的啊。
晚上就是非常奢靡的泡温泉活动。进去以后就是一个较大的游泳池,进去游了两下,水太浅了,刚到胸口,游得没有成就感,于是出水,再往深处走。嗯~后面绿树掩映下有不少小池子,什么“人参浴”啊,“当归浴”啊,一看,咦,这个池子都是女生在泡,我如果下去岂不是显得太过份了?算了,换一个,噢~这里兄弟多,十几个人挤十平米的池子,下去凑凑热闹。
haodong:这个工作....
宝方:那个工作....
bihong同学强烈抗议:你们俩不要出来泡温泉都谈工作好不好?!
haodong:喔....这个,好吧,要不我们谈谈轻松点的话题?
宝方:好,那个,我觉得美国肯定要向伊朗动武的....
haodong:同意,伊朗人够勇猛,内贾德比卡扎菲有种得多....
bihong同学:xxxx
之后还蒸了桑拿,冲了水疗,坐了鱼疗,不过天又黑人又多,坐在鱼池里好半天也没感觉有小鱼来挠,只看到几条小黑影在水面。想想看:毕竟是晚上了,那么多游客,鱼儿们白天都已经吃饱了,怎么还吃得下哩?
我过去只知道俄罗斯有个安东诺夫设计局专造大型运输机,后来才知道还有个伊留申设计局,也是名机辈出。命名人伊留申是俄罗斯著名的飞机设计师,1894年出生,1933年任总设计师。
伊尔-76于1971年首飞,北约代号“耿直”(Candid),属于四发中远程重型运输机,载重量40多吨,其中MF型载重量达52吨。虽然力气比不上“安”系列(安-124载重150吨,安-225载重250吨),但其航程、速度、耗油量、载重量都非常适合于中小规模的部队投送,所以成为了俄罗斯空投部队的主力“骡马”。由于缺少重型运输机研发技术,中国从90年代起向俄罗斯采购了数十架伊尔-76,“耿直”也算是中国空降部队的功臣。
伊尔-76有很多改型,包括预警机、消防及、救护机、加油机等。其中伊尔-78加油机是最有名的改型。
米-28于1982年首飞,米-28H是其最新改型,由于它在设计上大量参考了美国的AH-64(米-28最初就是以打败“阿帕奇”为设计目标的),所以如果从远处看两种直升机几乎无法区分,故而有人戏称米-28H是“阿帕奇斯基”,但其实“浩劫”的机动性和机载武器都强于AH-64。
从侧面看,两中直升机的轮廓都是瘦长的剑鱼形,机头底部都配有机关炮和雷达(米-28的头部黑色雷达看上去像个大鼻子)。米-28H在螺旋桨顶部还加有一个球形雷达,视野广阔胜过AH-64。“浩劫”的体型大过“阿帕奇”,但俄国人过硬的发动机技术使它的机动性却更胜一筹。但“阿帕奇”的前置机关炮可以由驾驶员佩戴的头盔控制:驾驶员头部偏向何方,机关炮就指向何方;而米-28H好像做不到这一点,估计老毛子的电子技术还是要差一些。
05年美国计划向台湾提供“阿帕奇”武装直升机,当时就盛传大陆会采购俄国的“浩劫”以对抗之,可见当今世上,能与AH-64一较高下的恐怕就只有米-28H了。
这是一段“浩劫”的视频,配以轻快动感的“mission impossible"音乐,颇有观赏性。
车东:我给你找找......这样“RewriteRule ^.*\.html$ /hello.html"
haodong:喔,这么强大。
车东:同学,rewrite很强的!专门有本书呢。
haodong:......车东,你以前向我推荐awk的时候就是扔给我一本书的,现在又是一本书。
车东:你要学的东西还多着咧。
haodong:学东西就是这样的:先是不知道,再是”知道有一本书“,然后是边写边看书,最后是再不用书。
hero:haodong,是你在叫吗?
haodong:是啊,我在叫你。
xgp:我不会面向对象,也不想学。
连华:为什么不想学?
xgp:我的心已经被一些东西占据了。
连华:是u盘吗?
xgp:......不,是Lisp。
于是,接龙开始了。
haodong:我不会面向对象,也不想学,我的心已经被汇编占据了。
老敖:我不会面向对象,也不想学,我的心已经被mysql占据了。
bihong:我不会面向对象,也不想学,我的心已经被pascal占据了。
hero:我不会面向对象,也不想学,我的心已经被awk占据了。
我:(写程序)
立中同志:(转过头看了我一下)
我:(转过头看了他一下)
(都没说话,又都转过去继续开发)
不需要语言的对话。
haodong:最近加班多吗?
哼哼:每天从早上9点干到晚上10点,回家倒头就睡,哪有时间加班啊?
xgp:(吃完饭回公司的路上)我每次看着平整的路面,都有一种想亲身贴地飞行的感觉....
suning: (看着xgp“宽大”的身材)如果你学会了贴地飞行,我就可以站在你身上了——像冲浪一样
xgp:........
(六个人走在路上)
hero:欧!地上有泡狗屎,小心不要踩上了,大家都小心点!
haodong:我们六个人,要是都踩上,那就叫“六合踩”了
haodong: 有u盘吗?借我用用。
xgp:我口袋里有七个u盘,你要借哪一个?
haodong:你太强了,居然随身带着....
xgp:(递过u盘)给
haodong:谢谢...你是一个随身带着七个u盘的男人,那么,我以后就叫你“男优”吧!
hero:haodong,这辈子你打算写程序写到什么时候?
haodong:写到我再也写不动为止。
hero:哇,这么有抱负,那你估计你什么时候会写不动呢?
haodong:(看了看表)一会儿下班了我就写不动了。
做项目时遇到要存储大量的key/value对数据。mdbm可以,但它太浪费内存,同事建议用BerkeleyDB,它一样能存key/value对,而且对内存没有那么苛刻的要求。
BerkeleyDB把主要的数据都存在硬盘,用cache来对付高度频繁的读写操作,但它不保证cache中的“脏数据”一定会立刻同步到硬盘上(除非你调用它的API同步函数)。这就意味着如果你的数据像黄金一样珍贵(比如银行交易数据),就不适宜用BerkeleyDB;但如果你的数据只是“比较”珍贵,丢个几十秒的数据没关系,那BerkeleyDB还是不错的选择。
BerkeleyDB还支持Hash/Btree/Queue等不同的索引方式,由用户在建库时自己选择。它只能在建库时指定cache的大小,以后不能再改,通用性稍微差了些,但对于后端的底层存储系统,这不是个大问题。
BerkeleyDB以前由sleepycat负责维护,06年oracle收购了BerkeleyDB。
自己写程序试了试,结果coredump了,就在创建数据库的那个函数pdb->open()里,gdb又跟不进去,后来找了立中同志才知道:redhat下都默认装了bdb,我没必要下载一个自己编译,那样反而链接错动态库了。最后ok,bdb存数据确实很省。
2004年冬,大家在食堂吃饭。
haodong:我大四的时候在外面接了个活——做一个支票软件,做了三个月,拿到了一千元,反正是新手,不敢奢求太多。同寝室一个同学炒股,捣腾了一阵子,也是赚了一千元。我可是辛辛苦苦多少天啊!我当时可不平衡了,老老实实做事还不如去搞投机呢。
同学:这个不能这样看了,风险不同的,你干的是低风险的事所以拿钱少,别人干的是高风险的事就应该拿得多嘛。
haodong:我很难同意你,虽然找不到什么反驳的。
2006年夏,大家聚了聚。
haodong:最近工作怎样?
同学:比较累,就是那些事搞来搞去的。看看周围那些搞金融的,住大房开大车,随便挥挥手就是几十万几百万,我们这群就每天累死累活为了那点工资....不爽啊....
haodong:呵呵呵呵,我记得以前你还说别人是风险高所以收入高嘛。
同学:(无言,苦笑)
haodong:以前你只是听我说故事,没有感觉,还可以理性的“点评”一番。现在你工作了一阵子,知道钱赚得辛苦,又看到挥金如土的人,相形之下终于感到不平衡了,终于体会到我以前的感觉了,你现在不觉得他们应该高收入了?
人就是这样的——一件事情如果没有发生在你的身上,你是不会觉得痛的。
haodong: (马上起身)哪里!? 哪里!?
hero: 靠,不要这样嘛,你能不能矜持一点?
haodong: 矜持?!我都矜持了27年了!再这么矜持下去彻底没戏了!
我其实是个c++ fans,但是不知道为什么,我总觉得这件事上Torvalds更能说服我 :)
也许我成为c++ fans只是因为跟java比,c++更像c一些。
c++确实有那么一点“臃肿”,构造函数、析构函数、拷贝构造函数、多态、模板....可比c要啰嗦得多,不像c那么精瘦那么底层,和OS靠得那么近。即使有STL,Boost这样成熟的库,c++的开发依然是艰难的——只要想想当你编译c++模板出错时编译器报的那些天书一样的信息就明白了。我现在能看懂大部分模板编译错误的信息,但是我怎能奢求其他语言的开发者能适应并喜欢上这些错误提示呢?
c++长成这样其实也是被迫的——如今的软件越来越庞大,越来越复杂,但对性能的要求却还在提高。如果用c开发像ACE这样的网络通信框架、如果用c来开发QT这样强大而通用的界面包,恐怕只有超级程序员才能完成,但你不能指望所有的程序员都是超人。所以尽管c++复杂,尽管c++难学难用,尽管在c程序员看来c++就像个怪胎、像个异形,但它长成异形何尝不是因为计算机行业的需要呢?
我们羡慕Torvalds,他一直以来都用c在开发操作系统,一个人一生只用一种语言开发一类软件是何等的幸福,就好像你可以跟某个你爱的人厮守一样。也许正因为如此,Torvalds对其它语言毫无感觉——反正他也没必要用。相反别的程序员,尤其是国内的同志们却更喜欢吹嘘自己用过多少种语言....这是一种荣誉吗?不,这是一种悲哀,只是大家还没有认识到。如果从国内有计算机开始你就是个程序员,那你就要先学汇编和c语言,到了90年代初,系统软件在国内活不下去了,你又只能去学foxbase学basic学c++,但是数据库系统ERP系统也活不下去了,你只能又去学java学.net....我们原来做过如此多类型的软件,学过如此多类型的语言!为什么中国的程序员就需要这么“博学”,这么“心态开放”?那是因为中国的计算机行业说到底也不过是美国计算机行业的跟班,这个行业的原创力和推动力还是远在美利坚,我们就是在不停的气喘吁吁的跟在后面跑而已。
Torvalds对c++的愤怒应该说其实是对软件行业浮躁之风的愤怒——大家只记得去追逐更方便更容易产生“产品”的快餐语言,而忘了去追求计算机科学更本质的东西——简约和求新。
只不过这次他怒错了方向,c++成了刀下鬼,如果让Torvalds谈谈java谈谈.net谈谈脚本语言,他估计会疯掉的。
列宁是秃头,斯大林是有头发的,赫鲁晓夫是秃头,勃涅日列夫是有头发的,安德罗波夫是秃头,契尔年科是有头发的,戈尔巴乔夫是秃头,叶利钦是有头发的,普京是秃头,猜猜看,下一个是谁呢?
二战前苏联的坦克曾经一度追求大口径主炮,为了装配大口径火炮,炮塔必然也要跟着扩充。最典型的就是科京设计的KV-2重型坦克,为了装上122mm口径火炮,不得不造了个巨大的炮塔,因此被戏称为”大脑袋的KV“。
虽然在苏德战争爆发初期,KV-2曾经创造了”一辆KV-2挡住德军一个师整整48个小时“的光荣战绩,但那只是特例,KV-2高达4米,在苏联的平原上成为了德军反坦克火力最易发现的活靶子。所以战争后期苏联虽然不断生产KV-1,却再没有制造KV-2。
KV-2之后苏联似乎接受了教训,再也不造高大的炮塔,科京后来设计的重型坦克IS-2炮塔就小了许多,IS-3的炮塔更是矮得像个乌龟壳。
下塔吉尔集团的产品也有同样趋势:T-55和T-62都是采用半圆形的铸造炮塔,能尽可能弹开袭来的射流。
到了T-72和T-90,改用焊接炮塔,形状变成了更低矮的圆盘型。
而尚处于研发阶段的神秘的T-95“黑鹰”坦克则已经开始考虑”无炮塔方案“,真是从有到无啊。
坦克之所以区别于步兵战车,就在于那一门威力巨大的主炮和一个明显的炮塔,但在最近几年的局部军事冲突中,坦克的大口径主炮似乎总显得过于笨重,尤其在城市战中,对付来自地下室或高楼的反坦克据点显得鞭长莫及,而步兵战车上灵活的小口径火炮却能克敌制胜。比如伊拉克战争,美军的斯特瑞克步兵战车就比M1主站坦克使用的多。于是,坦克的炮塔越来越矮,越来越灵活,越来越像步兵战车;而步兵战车的装甲越来越厚,搭载武器越来越重型,越来越像坦克,说不定有一天两种武器最终会走到一起,成为一种通用装甲战车....谁知道呢?
国内网站介绍Hadoop的文章都会提到MapReduce这个google的”招牌技术“。我是想不明白:GFS那套存储技术,很多做存储的公司都做得比它更好;而MapReduce做为分布式算法中的一个特例,很多互联网公司都有。但为什么大家都”误以为“这两门技术是来源于google的?因为以前做这些技术的公司都没什么名气,也没怎么宣传,而google拿出来写成论文大肆宣传。所以大家都把它当宝。
大家都以为蒸汽机是瓦特发明的,其实不是,同时代的很多工程师都做出了蒸汽机,但瓦特是第一个拿它去申请专利的,所以大家都以为是他发明的。你可以认为瓦特是个有商业眼光的先行者,也可以认为他是一个利用同时代人智慧的窃贼。就看你怎么想了。
那几架其实是米-6 (少了个“2”),也是苏联米里设计局设计的,50年代末开始使用,比米-26早了整整20年,现在米-6已经退役了。外形上米-6和米-26确实很像——身躯都又肥又长,像个吃饱了饭的河马。但米-6载重量只有12吨,螺旋桨只有5叶,机头成圆柱型且有瞭望窗;而米-26体积更大(这只能在有参照物的时候才能看出来),载重量达到了20吨,螺旋桨有8叶(是我以前弄错了,米-26一直就是八叶螺旋桨)。从某种意义上说,米-26其实是为了替代米-6而制造的。
#include <map> #include <ext/hash_map> using namespace std; using namespace __gnu_cxx; struct Node { size_t a; hash_map<int,Node> subNode; }; int main(void) {}用g++编译时却出错:
.... test.cpp:10: instantiated from here /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_pair.h:74: error:看样子是Node的定义还没有完成就让hash_map实例化它,所以无法成功。但是把hash_map换成map就可以编译通过了....即使是就用hash_map,上面的代码在VC2003.net环境上也可以编译通过。
`std::pair<_T1, _T2>::second' has incomplete type test.cpp:8: error: forward declaration of `struct Node'
我估计原因是gcc里的hash_map的实现依赖于pair的大小,所以如果_T2(即Node)类型不完整,pair就无法实例化,hash_map的大小也就无法确定。map其实也有这个问题,如果在编译时加上-D_GLIBCXX_CONCEPT_CHECKS参数,就可以看到编译错误。但为什么默认关掉这个参数?八成这是gcc做的一个“跳线逻辑”,免得开发者老抱怨 :)
至于VC2003能顺利编译,这是因为微软的一贯作风:宁可将就用户,不可将就标准。这和gcc是两个风格。
要解决hash_map的这个问题有两个办法,一个是使用继承:
struct BaseNode { }; struct Node: public BaseNode { size_t a; hash_map<int,BaseNode> subNode; };另一个是使用指针:
struct Node { size_t a; hash_map<int,Node> *subNode; };
昨天才完整看了一遍这部《入侵阿富汗》(The Beast Of War)。影片比我想象的要苍茫得多,到处是荒凉的戈壁,到处是险峻的石山,影片背景几乎就是一片暗黄。一辆迷路的苏军坦克被一心复仇的阿富汗游击队紧紧跟着,一名苏军士兵无法忍受坦克长的专横残忍,最终叛变,帮助游击队击毁了坦克。
又是“叛离者”模式。《十诫》中摩西叛离了埃及法老,《黑暗精灵》里崔斯特叛离了魔索布莱城。叛离者的故事总是长盛不衰,就在于叛离者的经历是非常艰难也非常独特的,因而他们的故事也异常曲折和感人。
看完影片总感觉它缺少了点什么,但它的情节并不空洞,节奏也不拖沓,那到底是缺少什么呢?是音乐。影片几乎没有背景音乐——不管情节是紧张还是舒缓,所以很多精彩之处难以造成观者的共鸣,不能不说是影片一大缺憾。像《断箭》这部奥斯卡获奖影片,其情节也并非登峰造极,但凭着Hans Zimmer劲度十足的配乐,一举征服观众和全体奥斯卡评委。如果能有同样重量级的音乐大师为《The Beast Of War》配乐的话,它也一定会成为一部经典影片。
评完电影手法再说说内容。
影片上面的苏军可谓如狼似虎——摧毁平民居住的村庄、在井里和湖边投毒、甚至用坦克活活压死俘虏....考虑到这是一部美国片,难免有夸张之处,但想想毕竟是侵略者,应该好不到哪儿去。美国人拍了这部《入侵阿富汗》,还拍了《第三滴血》,都是反映不屈不挠的阿富汗人反抗侵略的,但讽刺的是2001年美国人开着部队进入阿富汗了....几乎所有国内媒体都说美国会像苏联那样陷入“人民战争的汪洋大海”,结果呢,美国人三下五除二就把塔利班赶得不见人影了,接着很快把这个烫手山芋丢给了阿富汗临时政府和联合国,及时脱手。咦?看来美国佬比俄国佬还是要厉害多了。美国人不是傻子,美国军队更不是傻子,频繁的局部战争早就让美国人学会了怎么对付游击队。他们不吃老的一套。
《The Beast Of War》里给人印象最深刻的就是T-62坦克,真个势不可挡。T-62优于同时期的德国豹1,美国M60,的确独领风骚。想当年珍宝岛事件,我们费了好大的劲才抢到一辆T-62,在它的基础上研发出了69式主战坦克,也可算颇有渊源了。
米-26是苏联70年代的产品,为了在西伯利亚的冻土和沼泽地带搬运大型军事设施,米里设计局造出了这么一个超级巨人——载重量20吨的直升机,其体形和力气直到现在无直升机能出其右。这么大力的家伙,用的是五叶螺旋桨(后来改为八叶),装配两个D-136涡轮发动机,总功率近两万马力,相当于10架“阿帕奇”武装直升机。除了俄国佬,想不出什么人还会造这么大功率的发动机。
记得大一时第二个学期系里新老生座谈,老生就主要谈怎么怎么出国,有几个老生可能混得差一些,就谈谈怎么找工作,至于保研——那就不用谈了,只要个人愿意,问题都不大。但是到了毕业的时候,事情都变得不太一样了,因为我们这一届和老一届有个巨大的不同——我们入学时是第一次大学扩招——所以毕业那年,大堆大堆的毕业生挤入各种各样的招聘会,举着简历、张着嘴嗷嗷待哺(不好意思,比喻的有点夸张了),那场面着实壮观。
在这个就业市场人力资源高度过剩的情况下,考研和保研都变得异常困难。由于“911”事件,能出国的人少了,这一波人涌入就业和读研大军,局面更加不妙。老生们毕竟不是算命的,谁也料不到毕业时会冒出那么多同届毕业生,劳动力会变得那么不值钱。
之后我对“过来人”的经验都带三分怀疑,不是怀疑他们的为人,是因为这世界变化太快,“过来人”的经验太容易过时。
后来研一又搞个什么新老生座谈,嵌入式的一位老生开口就道:
”像我们学嵌入式的,工作还是很好找的,一毕业找个工资七八千的工作问题也不大...“
我当时就冷笑。本人读研前好待打过几份编程的零工,知道找工作混饭吃艰难,你当现在是八十年代呢,一毕业就吃香!也不知道他哪里调查来的,信口雌黄。
回到宿舍,一个嵌入式的同学还在那里为刚才听到的兴奋——唉,”老生“尽拿些过期的经验蒙小兄弟。
后来嵌入式的生意还真就是叫好不叫座,每家大公司都在鼓吹嵌入式,但搞嵌入式的人还是那么苦,待遇也不见得好,兄弟们找嵌入式的工作也很艰难——门槛较高,大公司的招嵌入式方面的人要求会这个会那个罗里罗嗦,小公司就更离谱,他希望你什么都会,最好去了就能包揽所有活!
我庆幸这次没听”老生长谈“,不然又空欢喜。
我们这一帮子人赶上扩招、赶上考研潮、赶上大学毕业生像塑料袋一样多的时代,不能全怪过来人经验不灵,也不能全怪自己不争气,我们只能叹口气说:
“老弟....最近局势不好...."
查看对方的java代码,没想到blowfish除了密钥,还有那么多可配参数,java代码里写的解密模式为"cfb/nopadding",这是什么?仔细查了手册,除了cfb,还有ecb,cbc....我晕,blowfish主页上提供的代码都没有这些东西啊!
跑去问计算机安全方面的“伪专家”,他答道:
“这些只是加密模式,任何对称加密算法都有这几种模式”
“那我应该用哪种模式才能让别人的java代码正确解密我的串?”
“不同模式跟加密算法没关系,加密出来的串都一样,你就用blowfish主页上的那些代码就行了”
说了等于没说。
我改为自己找资料,最后有了结果:不同对称加密算法(像DES、blowfish)确实都有那几种加密模式(ecb、cbc、cfb等),但并不是跟加密算法没关系,使用不同的加密模式,加密出来的串都是不同的!
使用什么加密模式,解密时也必须使用相同的模式,这就是对方无法解密我的串的原因——我压根就没使用任何加密模式...直接用Bruce Schneier老兄写的blowfish代码没戏了,我只能转而使用mcrypt,这个开源包不仅提供了各种对称加密算法,还提供了不同的加密模式,好用多了。
下载、编译成动态链接库libmcrypt.so,和我的测试代码链接运行,发现当我加密字符串“hello”,得出来得还是“hello”,再次抓狂,仔细看了mcrypt的示例代码??唉,我怎么稀里糊涂的把被加密的字符串声明成const了....最后能顺利编译运行的代码是:
char text[1024];其中的m_crypt_iv是cfb加密模式使用的初始向量,这段代码之所以不对被加密串进行64bit的填充(即nopadding),是因为cfb模式不用填充。
char *m_crypt_iv = "0808008"; char *m_dest = "hello"; char *m_key = "abcdefg"; MCRYPT td; td=mcrypt_module_open("blowfish",NULL,"cfb",NULL); if(td==MCRYPT_FAILED) printf("wrong!\n"); i=mcrypt_generic_init(td,m_key,strlen(m_key),m_crypt_iv); if(i<0) printf("wrong!\n"); memset(text,0,sizeof(text)); memmove(text,m_dest,strlen(m_dest)); mcrypt_generic(td,text,text_len); mcrypt_generic_deinit(td); mcrypt_module_close(td);
加密算法本身解决了,在编译PHP module时把libmcrypt.a加上,编出来的module就可以直接使用了。