Base64 和 Base58(技术分享整理01)

Base64编码

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一。Base64编码是**从二进制到字符**的过程,可用于**在HTTP环境**下传递较长的标识信息。采用Base64编码具有不可读性,需要**解码**后才能阅读。

1  标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,
2  而这些“%”号在存入数据库时还需要再进行转换,(ANSI SQL中已将“%”号用作通配符)

解决方案1 :采用一种用于URL的改进Base64编码,它在末尾填充’='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”

Base64要求 :

1 先把 “每三个8 Bit 的字节” 转换为 “四个6 Bit 的字节” (3X8 = 4X6 = 24),
2 再把6Bit的添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

例子:

转换前 11111111, 11111111, 11111111 (二进制)转换后 00111111, 00111111, 00111111, 00111111 (二进制)
Base64 和 Base58(技术分享整理01)_第1张图片

规则

编码的规则:①.把3个字节变成4个字节。
② 每76个字符加一个换行符。
③.最后的结束符也要处理。

原文的字节数量应该是3的倍数,如果这个条件不能满足的话,具体的解决办法是这样的:原文剩余的字节根据编码规则继续单独转(1变2,2变3;不够的位数用0补全),再用=号补满4个字节。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。

Base64转换码表64个:
一 : 26 + 26 =52个英文字母
二 : 0-9 共10个数字
三 :+ 和 /

A的索引是0 ,其他依次增长 + 为62 ; / 为 63

Base64 和 Base58(技术分享整理01)_第2张图片

Base58编码

Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I(发音ai)",和字母小写"l(发音erlo)",以及"+“和”/"符号。

设计Base58主要的目的是:避免混淆

在某些字体下,数字0和字母大写O,以及字母大写I和字母小写l会非常相似。

不使用"+“和”/"的原因是非字母或数字的字符串作为帐号较难被接受
没有标点符号,通常不会被从中间分行

Base64 和 Base58(技术分享整理01)_第3张图片Base64 和 Base58(技术分享整理01)_第4张图片

由于256不能被58整除,Base58无法像Base64那样转换为8bits的2进制后依次取出6bits就可以快速完成转换

因此,1 Base58编码算法需要除法运算实现

2 如果被编码的数据较长,则要用特殊的类来处理大数,在Bitcoin使用了OpenSSL中的BIGNUM:

code_string = “123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz”; x = convert_bytes_to_big_integer(hash_result); output_string = “”; while(x > 0) { (x, remainder) = divide(x, 58); output_string.append(code_string[remainder]); } repeat(number_of_leading_zero_bytes_in_hash) { output_string.append(code_string[0]); } output_string.reverse();

unioId 、 openId、swanId

openId

open_id:用户的唯一标识(同一个用户登录不同小程序,会有不同的open_id)

OpenId 类似于 商场购物会员卡,商场用会员卡识别用户,类似的,我们根据商场名字为每个用户生成了一张专属会员卡(openid只能在一个小程序中使用),每张会员卡只能在对应的商场才能够使用,你不能拿着沃尔玛的会员卡去华润万家积分。这是一种安全的授权方式**

官方说明unionId:

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。(同一平台下的小程序unionId互通)

swanId:

swan_id:设备唯一标识,APP卸载重安装不会变—>cuid

你可能感兴趣的:(技术分析整理,golang)