Wednesday, January 11, 2012

[C#] Alpha Sequence 英文流水號

其實這東西我也不知道是不是叫做英文流水號,翻譯也不知道是不是 Alpha Sequence ,反正我當初就是想弄個流水號轉成英文的功能而已,那時候需求很單純,就是將數字的流水號轉成英文而已,也沒有區分大小寫,所以就生出了下面這個function,主要就是將數字轉成大寫英文而已,相當單純。
    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