新浪微博mid的base62算法的C#实现

好吧,这几天给人写微博应用,于是彻底给新浪微博跪了,关于微博信息的返回值,又是id,又是mid,然后还有一个base62的mid

然后在开放平台的文档上,ID和MID的类型都是int64,而且两个的值是不一样的,但是在实际测试过程中,新发出去微博返回的ID和MID是一样的,虽说猜测觉得目前ID和MID只是为了向下兼容比较老的数据才留出来的,现在都一样,但由于新浪还是留了queryid和querymid进行互转处理的接口,所以还是不敢随便去认为ID和MID一样。

既然id和mid都是int64的数字,那么这个base62的mid是什么呢,从我知道的来看,目前新浪微博的每个微博都有一个独立页面类似

http://www.weibo.com/*****/ywnwezFce

而这个后面的ywnwezFce就是base62的mid,查阅资料这是一个短网址变换,变换的方法则是base62,如果需要对MID进行变换的话可以使用微博API的querymid,但是新浪对于API的请求有次数限制,虽然说这个API支持批量转换,但还是自己来实现这个转化比较好,网上关于base62的代码很多了,但新浪微博的短网址又不只是简单的对id的int64进行base62,而是进行拆分之后分别base62后再连接,于是就用C#实现了一下

public String bst = “0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”;
public String base62(String mid)
{
long int_mid = Int64.Parse(mid);
String result = “”;
do
{
long a = int_mid % 62;
result = bst[(int)a] + result;
int_mid = (int_mid – a) / 62;
} while (int_mid > 0);
return result.PadLeft(4,’0′);
}

public String getSinamid(String mid)
{
long int_mid = Int64.Parse(mid);
String result = “”;
for (int i = mid.Length – 7; i > -7; i -= 7)
{
int offset1 = (i < 0) ? 0 : i; int offset2 = i + 7; String num = base62(mid.Substring(offset1, offset2 - offset1)); result = num + result; } return result; } [/code]

《新浪微博mid的base62算法的C#实现》上有5条评论

  1. 感谢博主提供的思路。
    之前一直以为是直接对数值型的mid进行base62编码,难怪总得不到预期的值。
    请问博主算法中按7位分割的想法来源于哪里?新浪有相关文档吗?谢谢。

    1. 对于短网址中的字符,新浪确实在文档中只提了是对mid进行base62,我也是在试过直接base62给出的值都不对,7位分割是对新浪的正确的短网址值做base62转数字的模拟得出的结论,只能说目前测试出来新浪是这么做的,因为没有文档支持,所以就没法保证这个方法长期有效。只是正好手头要处理大量mid和短网址互转,不然还是用新浪给的接口比较保险。

  2. 博主方法有个小bug
    例如:
    3491273850170657
    博主的方法:yCirTIox 新浪的结果yCirT0Iox
    这是因为再取第一个七位时0170657, 新浪是会保证有四位输出,不足四位补0. 但是这里忘了补0.这样就会导致一旦七位数字前边有几个0的时候,无法解码出真正的值。 希望博主尽快修改下。这个bug因为不会总是触发所以很危险啊。
    修改如下
    public String base62(String mid)
    {
    long int_mid = Int64.Parse(mid);
    String result = “”;
    do
    {
    long a = int_mid % 62;
    result = bst[(int)a] + result;
    int_mid = (int_mid – a) / 62;
    } while (int_mid > 0);
    return result.PadLeft(4,’0′);
    }

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注