`
gembler
  • 浏览: 37211 次
  • 性别: 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:不知道淘宝网的思路是不是这样

 

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

分享到:
评论
80 楼 E生迅徒 2008-12-09  
问楼主一个问题,按照你说的规律,中文是怎么加密的
79 楼 offbye 2008-12-09  
我觉得这个url base64编码 主要是为了处理字符集乱码的问题,其次是为了好看,SEO的需要,还有就是复制 邮件发送时不容易出错
78 楼 0000 2008-12-09  
那个URL就是一个资源的标识,所以理想的结构是
而这个服务只是一个面向URL的(可以类比一下del.icio.us)
所以最理想的访问URL是

http://sample.domain/target_url 

但是实际上是不能直接把另外一个放在上面那个 target_url 的位置的吧
http://sample.domain/http://www.iteye.com/forum/

所说的直接输入是,人工直接输入上面的URL,就能访问那个资源(比如说是对JE论坛的一个描述)
77 楼 gembler 2008-12-08  
惨,想点“编辑”却点错了“引用”,搞到重发了

将错就错.......

参考一下以下做法吧:

http://translate.google.cn/translate?hl=zh-CN&sl=en&u=http://www.terracotta.org/&sa=X&oi=translate&resnum=1&ct=result&prev=/search%3Fq%3Dterracotta%26hl%3Dzh-CN%26newwindow%3D1%26sa%3DG

http://member1.taobao.com/member/login.jhtml?guest_redirect_url=http%3A%2F%2Fmy.taobao.com%2Fmytaobao%2Fguest%2Fmy_taobao_guest.htm&is_guest_login=1&redirect_url=

http://ju.atpanel.com/?url=http://mall.taobao.com/?ad_id=&am_id=&cm_id=&pm_id=1500099280c0a7fe18db
76 楼 gembler 2008-12-08  
0000 写道

直接用URL会出问题(变成路径了),但是如果进行编码(比如BASE 64),又不利于直接输入、可读等等等等了


直接输入?在什么情况下会直接输入?
你这个情况好像没什么必要动用Base64之类的东西吧
或者可以直接URIEncode一下,
如果你那个参数URL里有中文,也许在拼上去作为参数前先可以先编一下码。
75 楼 gembler 2008-12-08  
这个还是直接放后面让它自己搞吧:
/resource?url=http://www DOT xxxxxxxx DOT com
74 楼 0000 2008-12-08  
那我就跟风问一个问题吧,我有一个XX应用(纯属自己脑子抽风弄来玩的),想要达到REST的效果(在JAVA版说REST没人扔砖头吧),希望弄成下面这种结构的URL:
/resource/identifier
但是这个参数identifier又是一个URL,这可咋办呢?
直接用URL会出问题(变成路径了),但是如果进行编码(比如BASE 64),又不利于直接输入、可读等等等等了

有什么建议没?
73 楼 jitabc 2008-12-08  
以前研究过迅雷和网际快车的网址加密方式,也是用Base64加密的
72 楼 jbspxz 2008-12-08  
请问这个URL里的其它字符代表什么意思呢?
71 楼 idoou 2008-12-07  
牛人。。。。。。
70 楼 tedeyang 2008-12-06  
不能让客户跳出页面来操作数据,既有安全问题,也有商业考虑,另外url在系统间的传递也需要编码.
我们的系统也出于这种意图对url加密,一直是用自有加密算法加密的,当然也只能骗骗普通用户,加密强度很低,懂密码学的同学写个穷举,很快就能破解.至于性能,这点加密解密对CPU来说真的不值一提,赛扬1G的CPU跑100k的数据都是毫秒级的.
69 楼 gembler 2008-12-05  
cue2008 写道
这个淘宝研发人员不能乱说哦 呵呵

你想open source收山去? :)
68 楼 sdh5724 2008-12-05  
cue2008 写道
这个淘宝研发人员不能乱说哦 呵呵



都是公开的技术, 有什么不能说的。 再说, 我又不是TB的。
67 楼 maike 2008-12-05  
这个学习了,收下
66 楼 cue2008 2008-12-05  
这个淘宝研发人员不能乱说哦 呵呵
65 楼 sdh5724 2008-12-05  
grantbb 写道
应该是从安全、性能、SEO综合考虑的。
如果直接把各个参数暴露在URL上,那么很容易被别人拼出不同的URL进行便利,访问量大容易导致系统的性能瓶颈。


这个会通过方向代理, IP 监控, 以前esi cache解决的。 问题不大。
64 楼 microjuz 2008-12-05  
不好意思不ding一下,欠缺楼主的精神啊,可敬!
63 楼 grantbb 2008-12-05  
应该是从安全、性能、SEO综合考虑的。
如果直接把各个参数暴露在URL上,那么很容易被别人拼出不同的URL进行便利,访问量大容易导致系统的性能瓶颈。
62 楼 order 2008-12-05  
有意思,学习了
61 楼 dogstar 2008-12-05  
sdh5724 写道
crazy.j 写道
xiaoyu 写道
为什么google不用呢?

人家不已经说了么
一种是urlencode(url, enc)
一种是自己写程序编码
目的是一个!
GET访问的前提下,保证服务器接到的URL编码是一致的。
至于你想用urlencode也好或者自己编个火星码也好,个人爱好问题!

血的教训指得也就是,URL里别出现不该出现的东西~!


跟大家说点故事
   如果你的URL放在邮件里, 很多MAIL SERVER会修改的你的URL ,比如修改你的大小写, 修改你的编码, 这个很常见的情形。那么这个时候, 用户会非常的讨厌。 一些特殊的字符可能导致, MAIL SERVER在安全处理上, 把URL硬生生的拆散了。另外, 为了保持和不同的HTTP SERVER兼容, 不让HTTP SERVER按编码规则修改你的URL。 使用ASCII是最好的选择。 做个网站, 要考虑的细节很多, URL是一个非常重要的东西, 虽然不是技术上的难度, 但是需要细节上的实现。 URL生成工具是非常重要的东西, 甚至某种程度上,到了比较BT的程度, 特定的URL形式甚至有时候是营运的需要。

再次声明, 我不是TAOABO的。 我只是知道这些细节而已。



对,故事告诉大家,珍惜生命,原理非ascii字符集的url

相关推荐

    URL搜索关键字的编码

    标题“URL搜索关键字的编码”涉及的是在互联网中如何正确处理和编码URL中的查询参数,以便它们可以在HTTP请求中正确传输。在这个主题中,我们将深入探讨URL编码的原理、相关标准以及如何在Python中实现这一过程。 ...

    航信汉字编码与解码/eterm汉字编码与解码

    航信汉字的编码与解码,编码便于使自己的pid进行汉字传输, 航信汉字编码与解码,eterm汉字编码与解码,汉字编码问题

    淘宝 url 解码和编码方法(转的)

    在IT行业中,URL编码与解码是网络编程中不可或缺的一部分,尤其在处理包含特殊字符的网址时显得尤为重要。淘宝作为中国最大的电商平台,其URL中可能包含各种参数,这些参数需要进行正确的编码和解码以确保数据传输的...

    PCM编码与解码仿真实验报告.doc

    实验还包含了对无干扰模拟话音信号和数字波形信号的PCM编码与解码。通过低通滤波器和示波器观察解码后的输出波形,以验证解码的准确性。此外,对于数字信号,通过比较输入和解码后的数字值,分析解码误差,探讨可能...

    《卷积编码与解码的MATLAB实现及性能分析》.docx

    《卷积编码与解码的MATLAB实现及性能分析》.docx《卷积编码与解码的MATLAB实现及性能分析》.docx《卷积编码与解码的MATLAB实现及性能分析》.docx《卷积编码与解码的MATLAB实现及性能分析》.docx《卷积编码与解码的...

    哈夫曼编码与解码(C语言实现)

    在C语言中实现哈夫曼编码与解码,主要分为以下几个步骤: 1. **创建哈夫曼树**: - 首先,我们需要收集输入数据的频率,如字符出现的次数。 - 然后,将这些频率作为权重,创建一个优先队列(通常用最小堆实现)。...

    json编码与解码

    json编码与解码json编码与解码json编码与解码json编码与解码json编码与解码json编码与解码json编码与解码

    数字彩色图像的哈夫曼编码与解码的matlab实现

    哈夫曼编码(Huffman Coding),是一种熵编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般...

    RLE编码与解码算法及过程

    RLE编码与解码算法及其过程是数据压缩领域的一个基础且实用的技术。它通过简洁的方法减少数据中的冗余部分,尤其在处理那些具有大量连续重复元素的数据序列时表现出色。本文将对RLE编码与解码算法的过程进行详细介绍...

    曼彻斯特编码、解码

    C语言是一种强大的编程语言,用于编写这样的编码和解码函数是非常合适的。以下是对曼彻斯特编码和解码的详细解释: 1. **曼彻斯特编码过程**: - 每一位数据被分成两个相等的时间段。 - 如果原始数据位是0,...

    C++ jpeg图像编码与解码_C++jpeg图像编码与解码_C++JPEG编码_jpeg论文c++_

    本文将深入探讨C++中JPEG图像的编码与解码过程,以及相关的技术要点。 首先,理解JPEG编码的核心是离散余弦变换(Discrete Cosine Transform, DCT)。DCT将图像数据从空间域转换到频率域,使得高频信息更容易被压缩...

    huffman编码与解码

    huffman编码与解码附带数据结构答案

    哈夫曼编码与解码的程序

    在C语言中实现哈夫曼编码与解码的过程包括几个关键步骤:构造哈夫曼树、生成哈夫曼编码、编码文件和解码文件。 1. 构造哈夫曼树: - 首先,统计输入文本中每个字符出现的频率。 - 然后,创建一个最小堆(优先队列...

    base64 编码与解码 中文完美支持

    总的来说,Base64编码与解码技术在现代网络通信中扮演着重要角色,特别是在处理包含非ASCII字符集的数据时,如中文字符。这个"完美支持中文"的Base64工具通过高效和准确的实现,为开发者提供了一种可靠的解决方案,...

    tlv的java编码和解码

    本文将详细讲解如何在Java环境中实现TLV的编码与解码,并结合提供的`ber-tlv`资源进行分析。 TLV结构简单明了,由三个部分组成: 1. **Tag**:标识数据的类型或者含义,通常是一个整数。 2. **Length**:表示Value...

    《码书:编码与解码的战争》

    《码书:编码与解码的战争》是一本深入探讨编码与解码技术的书籍,主要聚焦于计算机科学中的编码理论及其在实际应用中的战争。这本书可能是为Java开发者或者对编码感兴趣的读者准备的,因为其标签明确指向了“java”...

    SMS 消息编码与解码---C语言实现(bit7 bit8 ucs2串口等)

    在本文中,我们将深入探讨如何使用C语言实现SMS消息的编码和解码,特别是7-bit编码和解码,以及UCS2编码。首先,我们关注7-bit编码和解码算法。 7-bit编码是一种用于SMS(Short Message Service)的编码方式,它...

    C++URL编码和解码

    C++作为一门强大的系统级编程语言,虽然没有内置的URL编码和解码函数,但开发者可以借助标准库和第三方库来实现这些功能。本文将深入探讨C++中如何进行URL编码和解码。 URL(Uniform Resource Locator)是互联网上...

    网页版PDU格式编码_解码

    使用文件名为"在线PDU格式编码_解码 使用AT指令发送中文短信.html"的文件,用户可以访问到主要的使用界面,而"在线PDU格式编码_解码 使用AT指令发送中文短信_files"文件则包含了与界面展示和功能实现相关的辅助文件...

    matlab开发-算术编码和解码

    在MATLAB中实现算术编码和解码是一项涉及到概率论、数字表示和算法设计的技术工作。下面将详细介绍算术编码的基本原理、实现过程以及如何在MATLAB中应用。 算术编码的工作原理基于概率模型。假设我们有一串数据,如...

Global site tag (gtag.js) - Google Analytics