先说一下应用场景:一条新闻有多个属性,一个hashId,一个tvId,先不管到底有啥区别,其实我也不知道为啥要弄这么多ID,反正就是不一样,有一个数据列表,里面的新闻只有tvId,后端java有个方法是做了转化,那么问题来了,前端也搞一个转化。
下面就开始写代码……不,是看java代码,对于一个写javascript的人来说,看java代码,心里有一种莫名的激动,因为“javascript和java看着就很像,感觉是亲戚呀”,哈哈哈
下面我java和js代码对比
我来说一下java的代码逻辑:
1、第一步,就是变量“SEED”转码,toLong->Long.parseLong(16进制转化)->结果:l_seed
2、generateFullPath中调用了一个generateUrl,参数就是id
1.1、通过上面的计算,用id和l_seed做异或运算,得到字符串
1.2、encodeBase36,包含了encode方法计算,encode做了一个循环计算取余数,并把余数当作索引值在字符串中查找,最后再反转字符串
3、对结果进行一个简单的长度判断
总结:里面前套了多层方法,在看的时候比较绕,好歹是看完了,中间有些方法不清楚作用,反正网上都能查到。
Intger.toHexString是16进制转化,Long.parseLong根据参数也可以进行16进制转化,可能是之前的开发为了凸显自己的知识丰富,非要用不用的函数做同一件事
在encode方法中的循环中有一个 q = num / radix,这个在js中是有小数点的,但是它这里却是整数,原来:java中的“/”、“%”运算,其中前者为取整,后者取余数,这个跟js和php差别都很大
虽然说java和js是亲戚是玩笑,但是确实,对于一个前端看java,还是挺容易的,有些方法可以猜测到大致的作用的。而且像append、reverse、toString、charrAt这些方法,跟jQuery、js中的作用极为神似。
踩坑:右侧是js方法,比较简单,里面最大的坑就是js的溢出问题,尤其是没有经过取整。两处,一个是l_seed在转化过程中,要变成数字类型的,一个是上面提到的除法结果取整。不过有个神奇的地方就是在encode中的循环,其实就是循环计算取整数和余数再重新赋值,直到while中条件达成,一开始因为没有取整,js得到的是一个40多位的字符串,但是字符串的最后几位正是正确的值,做一个截取就得到了,但实际上,取整后,前面的字符串就没了,直接得到结果,比如我要的是“19fdhalsx”,实际结果是“42843243*******0019fdhalsx”,这问题没再去深究。经过这一波操作,最大的体会就是,java很繁琐,js很坑…
在此感谢“鹤鹤”和“杨光”两位java同学的帮助