其實這東西我也不知道是不是叫做英文流水號,翻譯也不知道是不是 Alpha Sequence ,反正我當初就是想弄個流水號轉成英文的功能而已,那時候需求很單純,就是將數字的流水號轉成英文而已,也沒有區分大小寫,所以就生出了下面這個function,主要就是將數字轉成大寫英文而已,相當單純。
後來想了想,又加上了數字與區分大小寫的流水號,於是變成這樣。
最後,我參考了RFC 1738的URL可用字,再扣掉可能有危險的字元,寫成了ShortUrl版本的流水號。
因為我沒有仔細去研究短網址的機制是如何,要是我應該會用類似這種作法去生出短網址的字串啦,頂多把順序打亂讓人比較不好看出規則就是。
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