这10行比较字符串相等的代码给我整懵了,

公益中科 http://pf.39.net/bdfyy/bjzkbdfyy/180504/6213643.html

作者

码农唐磊

责编

Aholiab

封图

CSDN付费下载自视觉中国

抱歉用这种标题吸引你点进来了,不过你不妨看完,看看能否让你有所收获。

先直接上代码:

booleansafeEqual(Stringa,Stringb){if(a.length()!=b.length()){returnfalse;}intequal=0;for(inti=0;ia.length();i++){equal

=a.charAt(i)^b.charAt(i);}returnequal==0;}上面的代码是我根据原版(Scala)翻译成Java的,Scala版本(最开始吸引程序猿石头注意力的代码)如下:

defsafeEqual(a:String,b:String)={if(a.length!=b.length){false}else{varequal=0for(i-Array.range(0,a.length)){equal

=a(i)^b(i)}equal==0}}刚开始看到这段源码感觉挺奇怪的,这个函数的功能是比较两个字符串是否相等,首先“长度不等结果肯定不等,立即返回”这个很好理解。

再看看后面的,稍微动下脑筋,转弯下也能明白这其中的门道:通过异或操作1^1=0,1^0=1,0^0=0,来比较每一位,如果每一位都相等的话,两个字符串肯定相等,最后存储累计异或值的变量equal必定为0,否则为1。

再想一下呢?

for(i-Array.range(0,a.length)){if(a(i)^b(i)!=0)//ora(i)!=b[i]returnfalse}我们常常讲性能优化,从效率角度上讲,难道不是应该只要中途发现某一位的结果不同了(即为1)就可以立即返回两个字符串不相等了吗?(如上所示)。

这其中肯定有……

再细想一下呢?

结合方法名称safeEquals可能知道些眉目,与安全有关。

以前知道通过延迟计算等手段来提高效率的手段,但这种已经算出结果却延迟返回的,还是头一回!

我们来看看,JDK中也有类似的方法,如下代码摘自java.security.MessageDigest:

publicstaticbooleanisEqual(byte[]digesta,byte[]digestb){if(digesta==digestb)returntrue;if(digesta==null

digestb==null){returnfalse;}if(digesta.length!=digestb.length){returnfalse;}intresult=0;//time-constant


转载请注明:http://www.aierlanlan.com/grrz/3246.html