After hours i created this: (javastript for testing)
It's looks like random but isn't
- char_keys contains 8 rows with 60 unique chars
- helper_arr contains digits from id - function param (in reverse order) "5342" => [2,4,3,5]
- it can create 100 000 000 unique keys (with many combinations), but now i working to upgrade this (different key long)
Random generate works like this:
- for example helper_arr = [1,2,3,4,5];
- key is a generated string key  
helper_arr[0] = 1, so:
- key[0] = char_keys[1].substr(0,1), or
- key[0] = char_keys[1].substr(10,11), or
- key[0] = char_keys[1].substr(20,21), or
- key[0] = char_keys[1].substr(30,31), or
- key[0] = char_keys[1].substr(40,41), or
- key[0] = char_keys[1].substr(50,51), or
- key[0] = char_keys[1].substr(60,61).
(this is the only random thing ;) )
test = function(id){
    var char_keys = [
        '123456789',//only numbers here because it's random, users can create own links without number on first char 
        'LwFhy7YuEWGMH1IvoU85Jbjpkx4qN6zBmf9KtercZdQiRln2CSDXaVg3T0Ps', 
        'GTxkHtjXbB08ZWYqyiIu2agvdAlVFM6ShQznEcJrm47pU5sCLKfNP9eow1R3',
        '8QEmj3LeRdWuKsJngiBySf1Xz6wpVZ0Nkv2GFPHah7UMqAboYtlcT9rCx4D5', 
        'G5QdYeSl0LFBjJAHCD1xnmU9VfZRi6MX2PcwsaKoqT8p3vtNhWz7u4ybgrEI', 
        'j7fCcZNF6ytv58KUET1BAiMR2JqH0eIadrhQzug9kbmDnPSGLo4xXVlWpY3s', 
        'PyAMjsiox86zZ1vYCDwETm5SQlGK9b0rLJNV2aFtgXe4cW7IhqUpRfH3unBk',
        'h04edQN2c89xVSiCMBlw3LksWEKaUguGj6mDIvTJfRpPH1AozZyYnFrq75tX',
        '9YD82VBwJ0PrIUNG5Sx4dHX6vz1kZgWaRs7plFhfAuojytqbiCmQcKMeL3nT' 
    ];
    var id = id;
    var tmp = 0;
    var helper_arr = [];
    while(id>0){
        tmp = Math.floor(id/10);
        if(tmp==0) {helper_arr.push(id-(tmp*10)); break;}
        helper_arr.push(id-(tmp*10)+1);
        id=tmp;
    } 
    var key = char_keys[0].substr(getRandomInt(0,8),1);
    for(i=1;i<helper_arr.length;i++){
        key += char_keys[i].substr((getRandomInt(1,6)*helper_arr[i])-1,1);
    }
    for(i=helper_arr.length;i<char_keys.length;i++){
        key += char_keys[i].substr((getRandomInt(1,6)*1)-1,1);
    }
    return(key);
}