勘误网上REDIS_ENCODING_EMBSTR_SIZE_LIMIT默认值错误

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012817635/article/details/100043531

在看redis底层实现的时候,看到了string底层,3.2之后字符串长度小于等于REDIS_ENCODING_EMBSTR_SIZE_LIMIT时使用embstr,大于REDIS_ENCODING_EMBSTR_SIZE_LIMIT时使用raw。

网上所有博客都写REDIS_ENCODING_EMBSTR_SIZE_LIMIT为39

但是,这是一个错误的结论!!!!!被很多博客转载!!!

经过实践,redis版本3.2.12  这个值为44

而且源码中也注释了,这个值为44

特此勘误!!!!

展开阅读全文

中值表达式隐含错误勘误

11-05

#includern#includern#includern#define N 50rnrntypedef structrn char * base;rn char * top;rn int stacksize;rnoptrstack;//定义符号栈rnrntypedef structrn float * base;rn float * top;rn int stacksize;rnopndstack;//定义数字栈rnrnoptrstack initoptr()rnrn optrstack optr;rn optr.base = (char * )malloc( N * sizeof(char) );rn if(!optr.base)rn rn printf("error!\n");rn exit (0);rn rn optr.top = optr.base;rn optr.stacksize = N;rn return (optr);rn//符号栈初始化rnrnopndstack initopnd()rnrn opndstack opnd;rn opnd.base = (float * )malloc( N * sizeof(float) );rn if(!opnd.base)rn rn printf("error!\n");rn exit (0);rn rn opnd.top = opnd.base;rn opnd.stacksize = N;rn return (opnd);rn//数字栈初始化rnrnint optrempty(optrstack optr)rnrn if(optr.top==optr.base)rn return 1;rn else return 0;rn//符号栈空否?rnrn/*int opndempty(opndstack opnd)rnrn if(opnd.top==opnd.base)rn return 1;rn else return 0;rn//数字栈空否?*/rnrnvoid optrpush(optrstack optr,char newelem)rnrn * optr.top++ =newelem;rn//符号栈插入rnrnchar optrpop(optrstack optr)rnrn char oldelem;rn oldelem = * --optr.top;rn return oldelem;rn//符号栈弹出rnrnvoid opndpush(opndstack opnd,float newelem)rnrn * opnd.top++ =newelem;rn//数字栈插入rnrnfloat opndpop(opndstack opnd)rnrn float oldelem;rn oldelem = * --opnd.top;rn return oldelem;rn//数字栈弹出rnrnfloat gettopopnd(opndstack opnd)rnrn float e;rn if(opnd.top==opnd.base)rn exit (0);rn e = * (opnd.top-1);rn return e;rn//数字gettoprnrnchar gettopoptr(optrstack optr)rnrn char e;rn if(optr.top==optr.base)rn exit (0);rn e = * (optr.top-1);rn return e;rn//符号gettoprnrnchar precede(char firstchar,char secondchar)rnrn if((firstchar=='+')||(firstchar=='-'))rn rn if((secondchar=='(')||(secondchar=='#'))rn rn return '<';rn rn elsern rn return '>';rn rn rn if((firstchar=='*')||(firstchar=='/'))rn rn if((secondchar=='*')||(secondchar=='/')||(secondchar==')'))rn rn return '>';rn rn elsern rn return '<';rn rn rn if(firstchar=='(')rn rn return '<';rn rn if(firstchar==')')rn rn if(secondchar=='(')rn rn return '=';rn rn elsern rn return '>';rn rn rn if(firstchar=='#')rn rn if(secondchar=='#')rn rn return '=';rn rn elsern rn return '>';rn rn rn//判别优先性,firstchar表示最新见的的字符,secondchar表示被pop出来的字符rnrnfloat calculate(float num1,char op,float num2)rnrn if(op=='+') return (num1+num2);rn if(op=='-') return (num1-num2);rn if(op=='*') return (num1*num2);rn if(op=='/') return (num1/num2);rn//计算函数rnrnvoid operate(char object[N],optrstack optr,opndstack opnd)rnrn int i;rn float num,adder1=0.0,adder2=0.0;rn char firstchar,secondchar,cmp,temp;rn optrpush(optr,'#');rn for(i=0;(i='0'))rn rn num =(object[i]-'0')*1.0;rn opndpush(opnd,num);rn continue;rn //新数字入栈&跳出循环rn if((object[i]<'0')||(object[i]>'9'))rn rn firstchar=object[i];rn printf("\n%c\n",firstchar);rn //提取符号rn secondchar=gettopoptr(optr);rn cmp=precede(firstchar,secondchar);rn if(cmp=='<')rn rn optrpush(optr,firstchar);//新符号入栈rn continue;rn rn if(cmp=='=')rn rn temp=optrpop(optr);rn continue;rn rn if(cmp=='>')rn rn temp=optrpop(optr);rn adder1=opndpop(opnd);rn adder2=opndpop(opnd);rn opndpush(opnd,calculate(adder2,temp,adder1));rn if(precede(firstchar,gettopoptr(optr))=='=')rn rn temp=optrpop(optr);rn rn elsern rn optrpush(optr,firstchar);rn rn continue;rn rn rn printf("\nthe answer is %f\n",gettopopnd(opnd));rn//end 操作函数rnrnint main()rnrn char object[N];rn optrstack optr;rn opndstack opnd;rn optr=initoptr();rn opnd=initopnd();rn printf("Please input the arithmetic expression:\n\n");rn gets(object);rn operate(object,optr,opnd);rn return 0;rn//end mainrnrnRT,请问为什么不能输出结果呢?我暂时设定表达式中的数据都是个位数… 论坛

【技术勘误】用网上流传的“MD5模块”的千万要注意了!

03-24

现在的MD5计算模块似乎有几种版本,rn但是,大部分(甚至包括ASP的版本)存在【文件MD5计算不正确】的现象。rn经过我的仔细检查,其中网上流传甚广的两个能计算文件的版本是错误的。rn问题发生在计算一些具有特定文件/字符串大小的时候,问题出现几率很高。rnrn举几个例子(百度上随机抽选的)rn问题版本1:MD5函数为【Md5_[File/String]_Calc】rnhttp://hi.baidu.com/xlsdg/item/b72dbbbe6adb7f40ba0e12ddrn问题版本2:MD5函数为【Digest[File/String]ToHexStr】rnhttp://www.programfan.com/article/772.htmlrnrn其实,他们的源头都是这一个Robert Hubley的版本rnhttp://www.hackhome.com/InfoView/Article_106283.htmlrnrn[color=#FF0000]【错误一】[/color]rnMD5Final函数的一个If语句:rn[code=vb]rnIf lngBytesBuffered <= 56 Thenrn MD5Update 56 - lngBytesBuffered, paddingrnElsern MD5Update 120 - ByteCounter, paddingrnEnd Ifrn[/code]rn应该改为rn[code=vb]rnIf lngBytesBuffered <= 56 Thenrn MD5Update 56 - lngBytesBuffered, paddingrnElsern MD5Update 120 - lngBytesBuffered, paddingrnEnd Ifrn[/code]rn(即ByteCounter改为lngBytesBuffered)rnrn[color=#FF0000]【错误二】[/color]rn文件计算的读取条件判断出错rnDigestFileToHexStr(或者叫Md5_File_Calc)中rn[code=vb]If Loc(1) < LOF(1) Then[/code]rn应该改为:rn[code=vb]If Loc(1) <= LOF(1) Then[/code]rnrn【经过多次测试,并与权威MD5数据对比,修改后程序给出的MD5数据全部正确】rnrn当然,只有特定的长度才会触发BUG(但是这个范围相当广).rn以下是字符串函数的触发长度,包括了56,120-127,184-192....这些范围rn即rn[color=#008000]集合法表示:字符串BUG长度集合=56∪x∈Z|x∈[64n-8,64n-1],2<n[/color]rn[img=http://e.hiphotos.baidu.com/album/s%3D550%3Bq%3D90%3Bc%3Dxiangce%2C100%2C100/sign=4baa1e29a9ec8a13101a57e5c738e0b2/10dfa9ec8a1363277e56f8f5918fa0ec09fac7b8.jpg?referer=cbac6faf252dd42a061e359b2156&x=.jpg][/img]rn你自己也可以试试用(56字节)"12345678901234567890123456789012345678901234567890123456"计算,标准数据是49F193ADCE178490E34D1B3A4EC0064C,错误程序结果是29DC63DA78D43A804E8A4D4DCA707CC2rnrn当使用文件函数时,因为问题二,导致长度等于64倍数的文件都会缺少一个字节进行MD5Transform,rn即长度等于64倍数的文件也会触发BUGrn因为与字符串计算用的是同一个出问题的MD5Final,所以,rn[color=#008000]集合法表示:文件BUG长度集合=字符串BUG长度集合∪n∈Z|64n,1≤n[/color]rn[img=http://g.hiphotos.baidu.com/album/s%3D550%3Bq%3D90%3Bc%3Dxiangce%2C100%2C100/sign=2992f72ad100baa1be2c47be772bc82f/f9dcd100baa1cd11c42448e6b912c8fcc2ce2d61.jpg?referer=6f9cc763d143ad4bff3972f08b3f&x=.jpg][/img]rnrn希望能加精~[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/3.gif][/img]rn警醒使用网络上流传该类代码的人,以免造成大家的损失。rnrn(转自本人'ydm_bd'百度贴吧原文.http://tieba.baidu.com/p/2088917195) 论坛

Java编程思想4 勘误

12-12

《Java编程思想》的原著《thinking in Java》是世界上最经典的Java教程,从书中读者评价中可以看到全世界的Java爱好者公认这是一本通俗易懂,讲解生动的经典书籍,可是翻译成中文后,却成了公认的天书了呢?原因就是到处是拗口难懂的句子,还有到处的错字,翻译的错误。它还能通俗易懂了吗?rn答案是否定的。我痛苦的读了本书的大半,真的很痛苦,因为我仔细推敲每一处,每一句话,与英文原著对比。除了原著的极少几处错误外,都是译著的错误,如果我说本书没有经过校对过就出版了,没有人反对吧?至少书中写的专家指导委员会是虚设的,他们如果有人看过本书就不会出现这么多错误了,我把勘误发给机械工业出版社责任人,他们百般推脱,虽然承认书的错误,可是就是不肯再版时更正,也不肯发勘误,理由是“太忙了”,然后又推托说他们不懂技术,不懂技术的人负责出版Java书籍,如何保证质量?可笑啊!rn本书有这么多错误会误导多少人?浪费多少人的时间呐?简直是在犯罪。为了让更多的读者能摆脱错误的误导,我把我总结的勘误发上来,希望你们能先在书中改正然后再读,这样会轻松很多,其余的勘误部分,我一时还没有时间整理,一旦完成也发上来。rn我整理的非常细致,我甚至相信我勘误完成后的部分再极难发现错误了,这些都是我工作之余抽时间整理的,熬了多少个凌晨1、2点。希望更多的Java战士们能从中受益。rnrn如果你没有分来下载,可以email给我联系,我发给你:67529468@qq.comrn[color=#0000FF]希望版主能置顶一段时间,谢谢!!!因为很多人都会需要这个的,为了更多人能看到,我在三个板块发帖了,不会冲突吧?[/color]rnrn下载地址rnhttp://download.csdn.net/source/1895420 论坛

没有更多推荐了,返回首页