作者
码农唐磊
责编
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