用于URL缩短的十六进制到基数62转换

时间:2012-03-24 04:39:49

标签: javascript mongodb

我正在寻找将24个字符长的hex mongoDB对象ID转换为base62格式,以便它更短的URL。我不想从十六进制转换为整数然后转换为base62。是否有代码已经这样做了?

5 个答案:

答案 0 :(得分:4)

This可以在任意碱基/字母之间进行转换。

如果您将其用于网址,请考虑使用Base58,因为人们可以更轻松地输入,而不会混淆类似外观的字符。

答案 1 :(得分:1)

因为64是16的倍数,所以最好的方法是使用查找表。任何三位十六进制数字都由两个base64数字表示,因此每个查找表中需要16³=64²= 4096个条目才能实现这一点。

我有一个perl脚本,可以在https://gist.github.com/3730664

生成映射

我还有一个完整的生成和转换函数的实现(再次在perl中),我用它来转换MongoDB id,如果有用的话请告诉我。

编辑:我已将我正在使用的完整实现添加到上面链接的要点。

答案 2 :(得分:0)

节点int-encoder执行此操作

npm install int-encoder

var en = require('int-encoder');

//simple integer conversion
en.encode(12345678); // "ZXP0"
en.decode('ZXP0'); // 12345678

//convert big hex number using optional base argument
en.encode('e6c6b53d3c8160b22dad35a0f705ec09', 16); // 'hbDcW9aE89tzLYjDgyzajJ'
en.decode('hbDcW9aE89tzLYjDgyzajJ', 16); // 'e6c6b53d3c8160b22dad35a0f705ec09'

答案 3 :(得分:0)

请参阅下面的代码,用C#编写,将逻辑转换为您想要的任何语言。您还可以更改命名空间中的顺序或字符,以使转换对您而言是唯一的。

public static class ShortCodes
{
    private static Random rand = new Random();

    // You may change the "shortcode_Keyspace" variable to contain as many or as few characters as you
    // please.  The more characters that aer included in the "shortcode_Keyspace" constant, the shorter
    // the codes you can produce for a given long.
const string shortcode_Keyspace = "abcdefghijklmnopqrstuvwxyz0123456789";

    // Arbitrary constant for the maximum length of ShortCodes generated by the application.
const int shortcode_maxLen = 12;


    public static string LongToShortCode(long number)
    {
        int ks_len = shortcode_Keyspace.Length;
        string sc_result = "";
        long num_to_encode = number;
        long i = 0;
        do
        {
            i++;
            sc_result = shortcode_Keyspace[(int)(num_to_encode % ks_len)] + sc_result;
            num_to_encode = ((num_to_encode - (num_to_encode % ks_len)) / ks_len);
        }
        while (num_to_encode != 0);
        return sc_result;
    }


    public static long ShortCodeToLong(string shortcode)
    {
        int ks_len = shortcode_Keyspace.Length;
        long sc_result = 0;
        int sc_length = shortcode.Length;
        string code_to_decode = shortcode;
        for (int i = 0; i < code_to_decode.Length; i++)
        {
            sc_length--;
            char code_char = code_to_decode[i];
            sc_result += shortcode_Keyspace.IndexOf(code_char) * (long)(Math.Pow((double)ks_len, (double)sc_length));
        }
        return sc_result;
    }
}

答案 4 :(得分:0)

LZ-串

您可以使用lz-string压缩字符串。

我建议你使用他们的函数compressToBase64进行压缩并decompressFromBase64进行解压缩。

你可以使用他们的常规压缩&amp;解压缩函数但你的压缩字符串可能包含各种奇怪的中文字符。

您可以找到有关如何下载和使用lz-string here的指南。