`
gembler
  • 浏览: 36493 次
  • 性别: Icon_minigender_1
  • 来自: 妖都
社区版块
存档分类
最新评论

淘宝网的搜索关键字的编码与解码

    博客分类:
  • Java
阅读更多
lichd 写道
刚刚看到你对淘宝编码的研究,我个人认为淘宝那个编码可能是Base32规范的演化版,只不过淘宝使用0来代替=做末位填充,RFC 3548 (The Base16, Base32, and Base64 Data Encodings)
对这些都有规范

经过证实,lichd 的观点正确,由于我在本文发表之前,除Base64 之外,其他的BaseXX 都没接触过,所以不知道这个正是Base32 的效果。

 

不过看官们请放心,本文的思路也和Base32 符合。当时的乱打乱撞,结果造了一个古人已经造好的轮子,实在惭愧。

 

因此,感谢lichd 的观点,从而稀释了我体内SB细胞的浓度。

 

回头看了一下本文的一个旧实现(codec.zip ),一年前写得代码太糟糕了,不推荐。

现在提供一个相对不错的实现,>>猛击获取<<

 

-------------------------- -------------------------- -------------------- ---------------------

------------------------------------------分割线 --------------------------------------------

-------------------------- -------------------------- -------------------- ---------------------

 

 

很久之前发现淘宝网的搜索关键字在编码后有点可爱,小写英文字母+数字的组合。

想去研究一下,但是后面好像没了回事似的。。记性不好

然后这两天不知道为什么,突然间抽起条脑筋,跑去研究。。。。

 

--------------------------开始分割线--------------------------

 

在淘宝网上用关键字“gembler”搜索一下商品,得出以下URL:

 

http://search1.taobao.com/browse/0/n-0-----------------g,m5sw2ytmmvza----------------40--commend-0-all-0.htm?at_topsearch=1

                                                                                           (留意上面这里:“m5sw2ytmmvza”

 

经过一轮 天昏地暗、沙尘滚滚 的分析、研究之后,得出以下结论:

 

  在Base64中,码表是由 [A-Z,a-z,0-9,+,/,=(pad)] 组成的。
  然后自己也弄个码表,由 [a-z,2-7(这个2-7是在
淘宝网上搜索了n次而得出的结论 ] 组成的:

 

a b c d e f g h i j k l m n o p q r
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

 

-------------------------------愚蠢分割线---------------------------------

 

s t u v w x y z 2 3 4 5 6 7
18 19 20 21 22 23 24 25 26 27 28 29 30 31

 
  在Base64中,是将二进制连成一串,然后再按6位来分割,分割完后在前面补0,这个地球人都知道,不多说了。
  而我呢,哈哈,捣蛋一下,按5位来分割,如果刚好够分,那就爽了,

  但是,世事往往不如人意,位数不够,那咋办呢?看下面 :)
 
  在Base64中,是用"="来解决的吧。
  现在呢,就是在前面补0,然后在后面再补0,其实就是前后补0,

  但是, 按5位来分 ,前面3个0是补定的了,后面的0就看上帝怎么安排了。
 
  举个小例子:字符串 "aaa",(编码/加密)后是 "mfqwc"
 

二进制: 01100001 01100001 01100001

转换后: (000 )01100 (000 )00101 (000 )10000 (000 )10110 (000 )0001(0 )
十进制: 12 5 16 22 2
码表对应: m f q w c

 
  反过来,(解码/解密):
 

码表对应: m f q w c
十进制: 12 5 16 22 2
二进制: 00001100 00000101 00010000 00010110 00000010
去掉前3个0后: 01100 00101 10000 10110 00010
合并后: 0110000101100001011000010

 
  然后把合并后的串的长度除一下8,发现多了个0:
 

合并后的 二进制码: 01100001 01100001 01100001 0


  多了就算了,不要了(其实是在{编码/加密}的分割时候,在分剩的余数的后面补的0)。
  然后再将 byte[] 转回字符串

 

  OK!又见回"aaa"了。    :)
 
  *有一点值得注意的是:UTF-8、GBK、GB18030 一般都没什么问题,但是 GB2312 可能字符集不够丰富,繁体字在decode的时候成问号了。

 

搞了半天,“可视化编辑器”的 Java Code不好使,骨干代码在回帖里贴出................(完整的代码,有兴趣的同志们请见附件!

 

--------------------------结束分割线--------------------------

 

。。。整理好了,整个人都铺满了灰尘.......

 

PS:不知道淘宝网的思路是不是这样

 

(补:另外一篇讨论 - “ 拍拍网的搜索关键字的编码与解码 ”)

分享到:
评论
100 楼 realzhang 2009-11-28  
解决了我n久的疑惑
99 楼 feifeiyaqi3 2009-06-17  
ry.china 写道
老兄做什么工作的呀,能把这玩意弄出来

这人特牛,NZTMD的牛死了。
98 楼 feifeiyaqi3 2009-06-17  
ry.china 写道
老兄做什么工作的呀,能把这玩意弄出来

vb http://www.iteye.com/topic/286240
97 楼 ry.china 2009-05-14  
老兄做什么工作的呀,能把这玩意弄出来
96 楼 sunchaohui_koko 2009-05-13  
gembler 写道
sdh5724 写道

这点计算, 跟性能无关, 实际上这个URL增加了处理URL的时间。


跟性能无关也对,从淘宝网上可以看出,以淘宝商城为例:

搜索:gembler

是先post到 - http://list.mall.taobao.com/search_dispatcher.htm

然后分发到 - http://list.mall.taobao.com/search_product.htm?type=p&sort=st&style=g&at_topsearch=1&user_action=initiative&q=gembler

再解析为 - http://list.mall.taobao.com/0/g-st----g,m5sw2ytmmvza-40-0--0.htm - 并redirect。

最后才response

但是这个过程一般是感觉不到

莫非与爬虫相关!
95 楼 Hooopo 2009-05-13  
gembler大侠。。帮忙看看这个是啥加密方式:


p_head_mLL0_8922g206092->p_large_8yb6_8922g206092
head_ywyE_35301e206112->large_8yKr_35301e206112
head_IKLB_35731i206112->large_XuXh_35731i206112
head_15tE_6813c206099->large_ffCI_6813c206099
head_d7UR_9705n241025->large_6hpt_9705n241025
head_BVM0_19591e206109->large_jLGt_19591e206109
p_head_uLKb_2125g206110->p_large_G88I_2125g206110

Ps:这是校内的相册缩略图和大图url的对应,但是不知道是通过什么算法得到的。
94 楼 sdh5724 2009-01-18  
想不明白, 我亲身出来说法, 居然还有这么多猜测, 哈哈哈
有点挖坟的问道了。
93 楼 murainwood 2009-01-18  
Base64 很常用啊
92 楼 sutra 2009-01-18  
reeze 写道
gembler 写道
sdh5724 写道

几乎是为了seo.


看来,淘宝网为什么要这么做,已经有答案了。

跟SEO没有关系吧。
这样根本就不SEO。


我认为是为了把url拉丁化,拉丁化的目的是照顾那些IM工具,mail工具等里面对url地址自动加连接时进行url切断时,不被错误切开。
91 楼 dogstar 2008-12-28  
晕,想的还真多。就是为了避免中文作为url的一部分而引起的浏览器get请求的编码问题。跟其他的都没关系。
90 楼 ideage 2008-12-28  
fins 写道
我觉得还有一个原因:

避免直接通过URL 来调用淘宝的相关服务.

举个例子:  你要买搜索苹果.

通常需要进入搜索页面 进行搜索.
而搜索页面有大量的广告  图片 flash之类的.

如果这时候 你突然发现 使用  
引用
www.taobao.com/search?key=apple


也能够达到同样效果, 那么很有可能你就不会通过搜索页面去搜索了.
那些广告的价值就低了

===============

当然 这只是我个人分析 而且这个也许不是主要原因.



强烈支持.
89 楼 piaoye83 2008-12-11  
高手,很强大,努力学习
88 楼 gembler 2008-12-11  
wushaoen 写道
Hi,gembler!
   请问一下,您能知道http://v.youku.com/v_show/id_XNTg2NTM1ODg=.html
它那个唯一标识
XNTg3MjEwNzI
XNTg2NTM1ODg
用java是如何算的?


请看我之前的回复:

gembler 写道
Base64转出来的也不是很顺眼。。(大小写,数字,+,=,/) 一起来。

youku疑似Base64转出来的:
http://v.youku.com/v_show/id_XNTY4ODk1NDA=.html


从编码之后的样子的style来看,个人感觉是Base64,Base64的实现有很多,你可以到开源社区找找看
要是确实懒的找的话,据我所知,jdk的rt.jar里有两个选择:
1.com.sun.org.apache.xerces.internal.impl.dv.util.Base64(有source code)
2.sun.misc.BASE64Encoder/sun.misc.BASE64Decoder(没source code)

其实你所提到的"唯一标识"可能youku用一个主键ID编码出来的
87 楼 wushaoen 2008-12-11  
Hi,gembler!
   请问一下,您能知道http://v.youku.com/v_show/id_XNTg2NTM1ODg=.html
它那个唯一标识
XNTg3MjEwNzI
XNTg2NTM1ODg
用java是如何算的?
86 楼 gembler 2008-12-10  
E生迅徒 写道
问楼主一个问题,按照你说的规律,中文是怎么加密的

先说明一点,严格来说这不算是加密,可以说是编码。
中文?中文的道理也是一样的,也许你应该去下个source code,拿去跑一下。
85 楼 penghuangit 2008-12-10  
太牛了,这样都能搞定。收藏了。
以后肯定能派上用场。谢谢 LZ.
84 楼 fjlyxx 2008-12-10  
这有可能是历史原因导致的,面对历史系统,我确实对编码还搞不定,提不出一个很好的解决方案。GBK在WIN下面有肯能是2转1 在LINUX下可能是3转1。面对这种问题的时候确实很难办。
URL跟后面的服务交互一点关系都没有。我不这么认为, 举个简单的例子吧,你提交表单后,如果你提交的那台服务器应用的工作只是一个适配,它要吧你的参数组织成SOAP报文或其他服务访问规范的时候,这就可以同一编码了。
83 楼 sdh5724 2008-12-10  
你当搞了这么多年网站的都搞不定编码问题也太可笑了。 URL跟后面的服务交互一点关系都没有。
82 楼 fjlyxx 2008-12-10  
很有可能是TAOBO后台搞群集的时候碰见编码问题了。不同操作系统和中间件间交互编码确实是一个问题。TABAO后台是分布式服务的话也许就会碰见这种问题。
81 楼 everlasting_188 2008-12-09  
个人感觉是: 1>处理url中使用get传递特殊字符的问题  2>部分加密    3>网站的目录结构可以使用中文,这个已经是很好的理由了。

相关推荐

Global site tag (gtag.js) - Google Analytics