How do sites like goo.gl or jsfiddle generate their URL codes?

前端 未结 3 1430
离开以前
离开以前 2021-01-30 09:15

I would like to generate a code like goo.gl and jsfiddle websites (http://jsfiddle.net/XzKvP/).

I tried different things that give me too large of a guid,

3条回答
  •  一向
    一向 (楼主)
    2021-01-30 09:48

    You can think of the five-letter code as a number in base-62 notation: your "digits" are 26 lowercase and 26 uppercase letters, and digits from 0 to 9. (26+26+10) digits in total. Given a number from 0 to 62^5 (which equals 916132832) (say, your primary key) you can do the conversion to a five-digit base-62 as follows:

    private static char Base62Digit(int d) {
        if (d < 26) {
            return (char)('a'+d);
        } else if (d < 52) {
            return (char)('A'+d-26);
        } else if (d < 62) {
            return (char)('0'+d-52);
        } else {
            throw new ArgumentException("d");
        }
    }
    
    static string ToBase62(int n) {
        var res = "";
        while (n != 0) {
            res = Base62Digit(n%62) + res;
            n /= 62;
        }
        return res;
    }
    
    private static int Base62Decode(char c) {
        if (c >= '0' && c <= '9') {
            return 52 + c - '0';
        } else if (c >= 'A' && c <= 'Z') {
            return 26 + c - 'A';
        } else if (c >= 'a' && c <= 'z') {
            return c - 'a';
        } else {
            throw new ArgumentException("c");
        }
    }
    
    static int FromBase62(string s) {
        return s.Aggregate(0, (current, c) => current*62 + Base62Decode(c));
    }
    

    Here is how to generate cryptographically strong random numbers (you need to add a reference to System.Security):

    private static readonly RNGCryptoServiceProvider crypto =
        new RNGCryptoServiceProvider();
    
    private static int NextRandom() {
        var buf = new byte[4];
        crypto.GetBytes(buf);
        return buf.Aggregate(0, (p, v) => (p << 8) + v) & 0x3FFFFFFF;
    }
    

提交回复
热议问题