private static string AlphaSequence(int ord)
    {
        int residue = ord;
        string alpha = String.Empty;
        int modulo;
        while (residue > 0)
        {
            modulo = (residue - 1) % 26;
            alpha = Convert.ToChar(65 + modulo).ToString() + alpha;
            residue = ((residue - modulo) / 26);
        }
        return alpha;
    }
後來想了想,又加上了數字與區分大小寫的流水號,於是變成這樣。
    private static string AlphaSequence3(int ord)
    {
        int residue = ord;
        string alpha = String.Empty;
        int modulo;
        while (residue > 0)
        {
            modulo = (residue - 1) % 62;
            if (modulo > 35)
                alpha = Convert.ToChar(48 + modulo + 13).ToString() + alpha;
            else if (modulo > 9)
                alpha = Convert.ToChar(48 + modulo + 7).ToString() + alpha;
            else
                alpha = Convert.ToChar(48 + modulo).ToString() + alpha;
            residue = ((residue - modulo) / 62);
        }
        return alpha;
    }
最後,我參考了RFC 1738的URL可用字,再扣掉可能有危險的字元,寫成了ShortUrl版本的流水號。
    private static string AlphaSequence4(int ord)
    {
        int residue = ord;
        string alpha = String.Empty;
        int modulo;
        char[] charbase = ("01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz$_.+!*(),").ToCharArray();
        while (residue > 0)
        {
            modulo = (residue - 1) % 71;
            alpha = charbase[modulo] + alpha;
            residue = ((residue - modulo) / 71);
        }
        return alpha;
    }
因為我沒有仔細去研究短網址的機制是如何,要是我應該會用類似這種作法去生出短網址的字串啦,頂多把順序打亂讓人比較不好看出規則就是。
No comments:
Post a Comment