URL Shortener algoritme?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Full Stack Java Developer

Functieomschrijving Met jouw expertise zorg je als java developer voor de meest plezierige en efficiënte klant ervaring. Met jouw state-of-the-art-systemen verbeter je onze business en maak je echt impact! Want als je in ons tech team werkt, houd je jezelf en Nederland in beweging. Wij zijn continu bezig onze business en processen te optimaliseren, zodat we onze klanten en kandidaten meer gemak, snelheid en transparantie kunnen bieden. Impactvolle tech, daar doen we het voor. Artificial intelligence, machine learning en innovatieve zoek oplossingen. Zoek oplossingen? Yes! Solliciteren moet makkelijk en leuk zijn. Toch? Daar kan jij aan bijdragen! wat ga je

Bekijk vacature »

Fullstack Java Developer

Bedrijfsomschrijving Our relation is an international organization that is located in the area of Amsterdam. They are well known in the market due to their innovative service delivery on the IT side and their passionate employees. They have received several awards for their efforts in IT! They strive to stimulate working and self-development in order to bring out the best in every organization worldwide. IT is crucial in this organization in order to improve their services. Currently, they have a monolithic architecture and they want to make the shift to Microservices. As this project is just starting you will be

Bekijk vacature »

.Net Software Developer – Smart Logistics

Heb jij ervaring met applicatie ontwikkeling, testen en onderhoud van business-kritische .NET applicaties? En wil je graag met de nieuwste technologieën werken binnen een DevOps scrumteam? Wat ga je doen? “Use digital to move smarter De unit Smart Logistics binnen de Transport & Logistics sector van CGI ontwerpt, bouwt en onderhoudt veelal missie-kritische applicaties voor onze klanten uit de transport en logistieke sector. Zonder deze sector worden onze pakketjes niet op tijd afgeleverd, rijden de treinen niet meer van a naar b en varen schepen niet veilig de haven binnen. Om deze transport en logistieke ketens te monitoren en sturen,

Bekijk vacature »

IT-traineeship junior software ontwikkelaar

Zoek jij een stevige uitdaging en de mogelijkheid om veel nieuwe dingen te leren in een dynamisch vakgebied? Doe mee aan ons IT Professional Program en ontwikkel jezelf tot software engineer! Je begint met een opleidingstraject van ongeveer 4 maanden. Hierin ga je aan de slag met verschillende technieken die je op conceptueel niveau leert te overzien en interpreteren. Onderwerpen die aan bod komen zijn o.a. programmeren (Java/C#/Python), Object Oriëntatie, Databases, Webservices & webtechnologieën, Domain Driven Design en Continuous Integration/Continuous Delivery. Sommige van deze onderdelen sluit je af met een examen en bijbehorende certificering. Het opleidingstraject zelf sluit je af

Bekijk vacature »

Platform & Device Developer

You will work on many dynamic projects as a Platform & Device Developer, in which you can express your creativity. How do I become a Platform & Device Developer at Coolblue? As Platform & Device Developer, you are responsible for building and developing the platforms on which all Coolblue employees work. You are inquisitive and never shy away from a challenge. You like to know why certain systems or processes have been developed the way they have and conduct some research to improve them. You talk to different stakeholders and developers to see if your new solution works. In this

Bekijk vacature »

New Business Developer Rijswijk

Ben jij het zat om alle KvK-lijsten volledig af te bellen? Komt de koffie van die ene persoon waar je nog steeds geen deal hebt gesloten je neus uit? En blijf je potentiële klanten stalken zonder resultaat? Dan is het tijd om het anders te gaan doen! Neem afscheid van de standaard salesaanpak en ga bij PEAK-IT aan de slag met onze unieke en eigenwijze salesstrategie! Word onze New Business Developer in Rijswijk, die niet bang is om het anders te doen! Hoe maak jij onze klanten blij? Dankzij jou hoeven onze klanten niet bang te zijn dat hun IT-infrastructuur

Bekijk vacature »

Python Developer / Data Engineer / data pipelines

Bedrijfsomschrijving Bij dit grote, innovatieve technische bedrijf wil men graag flink groeien dit jaar, namelijk van zo'n 100 naar 120 mensen. In de afgelopen jaren is er hard gewerkt om een nieuw software product op de markt te zetten ter ondersteuning van hun fysieke producten en omdat dit een groot succes is, wordt het nu uitgerold over het hele bedrijf en daarmee een groot deel van de wereld. Er is dus werk aan de winkel! Jij werkt in het back-end team dat ervoor zorgt dat grote hoeveelheden data van de bron naar de front-end worden gebracht in het juiste formaat.

Bekijk vacature »

Front-End Developer Design System

Samen met andere developers en designers bij Coolblue maak jij onze webshop elke dag een beetje beter om zo onze klanten blij te maken. Wat doe je als Front-End Developer Design System bij Coolblue? Bij Coolblue speelt het Design System team een belangrijke rol in het garanderen van de beste klantreis. Het team werkt samen met Designers en Developers om een ​​verzameling tried and true bouwstenen, patronen en richtlijnen op te bouwen. Je werkt aan de gebruiksvriendelijkheid van onze webshop en bent ervan overtuigd dat mooi design voor iedereen toegankelijk moet zijn. Je krijgt energie van het bedenken van creatieve

Bekijk vacature »

.NET Developer Azure

Bedrijfsomschrijving Deze organisatie in de regio van Ede/Wageningen waar jij als .NET Developer komt te werken is marktleider en pionier op het gebied van High-Quality apparatuur in de zorg. Het Scrum team waar jij deel van zal uitmaken bestaat uit zes developers. Als .NET Developer draag jij dagelijks bij aan een gezondere toekomst. De apparatuur waar jij de software voor ontwikkelt wordt wereldwijd ingezet in meer dan 5000 ziekenhuizen. Iedere 4 minuten krijgt iemand ter wereld een behandeling middels deze apparatuur. Omdat de organisatie continu bezig is met innovatie krijg jij als .NET Developer de ruimte om met nieuwste- en

Bekijk vacature »

Backend Developer XQuery

Bedrijfsomschrijving Voor een vooruitstrevende organisatie binnen de zorg in Den Haag zijn wij opzoek naar een Back-end Developer die ervaring heeft met XQuery en Vue.JS. Je zal ontwikkelen aan een tof en complex zorgplatform en koppelingen maken met de NoSQL database. Ook het testen en documenteren van de ontwikkelde functionaliteiten behoort tot zijn verantwoordelijkheden. Door COVID zoeken ze iemand die goed in staat in zelfstandig vanuit huis te werken. Functieomschrijving Ben jij een Back-end Developer en heb je ervaring met XQuery, NoSQL-databases, JSON en REST API's? Wil je meewerken aan een grootschalig project binnen een vooruitstrevende zorg omgeving? Reageer dan

Bekijk vacature »

Fullstack ontwikkelaar

Bedrijfsomschrijving Bij het accepteren van dit aanbod kom je terecht binnen een veelzijdige organisatie waar een goede sfeer hangt. Zij zijn gewend dagelijks met elkaar te lunchen en ruimte is voor een potje Mario. Als Fullstack ontwikkelaar ga je je op projectbasis bezighouden met het ontwikkelen van content voor diverse opdrachtgevers. De projecten waar je aan gaat werken zullen verschillende qua omvang. Hierbij kan je rekening houden met een gemiddelde doorlooptijd van een half jaar, waarbij er meerdere projecten naast elkaar kunnen lopen. De nadruk zal liggen op ontwikkeling aan de front-end, maar ook op het gebied van ontwikkeling aan

Bekijk vacature »

Typescript Developer Internationaal

Bedrijfsomschrijving De organisatie waar jij als TypeScript Developer komt te werken is te karakteriseren als een handelsonderneming en een echt familiebedrijf. Het bedrijf is internationaal bekend en is gelegen in Utrecht. Er wordt veel waarde gehecht aan een open en laagdrempelige bedrijfscultuur. Als TypeScript Developer met een hands-on mentaliteit zal jij de hoofdverantwoordelijke worden voor de continuïteit en toekomst van de TypeScript webapplicaties. Deze applicaties dienen gekoppeld te worden aan het huidige IT-landschap binnen de organisatie en worden gebouwd middels TypeScript, Angular, NodeJS en GraphQL. Jij zal dus het echte pionierswerk verrichten. Voor dit pionierswerk krijg jij als Developer de

Bekijk vacature »

Back-end Developer

Cube in Twente is op zoek naar een Back-end Developer Medior / Senior Functie omschrijving Als Back-end Developer bouw je met jouw kennis de beste oplossingen voor de vragen van onze klanten en kun je goed onderbouwen waarom nu juist déze techniek het beste aansluit bij zijn wensen. Daarnaast sta je ervoor open je kennis te delen met je collega developers. Op deze manier haal jij het maximale uit de samenwerking met de klant en til jij je collega’s naar een hoger niveau. We zijn gegroeid door focus te houden op het plezier van het team en op de details

Bekijk vacature »

Medior PHP Developer

As a PHP Developer at Coolblue, you ensure that our webshops work as optimal as possible. How do I become a Medior PHP Developer at Coolblue? As a PHP Developer you work together with other development teams to make our webshop work as optimal as possible and to make our customers happy. Although you are a PHP Developer, you are not averse to a little C# or JavaScript. Would you also like to become a PHP Developer at Coolblue? Read below if the job suits you.” You enjoy doing this Writing PHP code, but can also find your way in

Bekijk vacature »

Software Developer / full-stack

Bedrijfsomschrijving Voor een organisatie binnen de zakelijke dienstverlening zijn wij op zoek naar een Software Developer met goede kennis van zowel Java als front-end technieken als Angular. Het betreft een organisatie bestaande uit ongeveer 100 mensen die klaar staan voor ruim twee duizend klanten. De organisatie staat bekend om het feit dat zij met hun kwalitatief goede dienst een van de snelste zijn. Dit valt op in de markt en dit bewerkstelligen zij door alles zoveel mogelijk te automatiseren. IT, en software development in het bijzonder, wordt als erg belangrijk gezien. Het complexe applicatie landschap is geheel maatwerk en geschreven

Bekijk vacature »

Pagina: 1 2 volgende »

Wouter De Schuyter

Wouter De Schuyter

18/04/2012 18:05:10
Quote Anchor link
Hallo,

Ik heb onlangs dit domein gekocht en zou dus een persoonlijke url shortener willen maken.

Nu zou ik een algoritme nodig hebben voor de URL's te linken in de DB, dit kan uitraard gewoon met cijfers (id van de url bv) maar dat is niet echt netjes en gaat na verloop van tijd ook niet meer effectief zijn bv meer dan 10000 zijn al meteen 5 characters extra terwijl je met 4 cijfers & letters veel meer mogelijkheden hebt.

Een random string genereren met een lijst characters is een optie, maar dan zou ik voor elke mogelijkheid moeten kijken of dit nog niet in de DB bestaat en dat lijkt mij ook niet de ideale oplossing, stel dat er 100 mogelijke combinaties zijn en 99 zijn er al van gebruikt en het script moet dan telkens een nieuwe string genereren en vergelijken.. Dat kan niet de manier zijn.. Of wel?

Iemand suggesties hoe je dit het best aanpakt?
 
PHP hulp

PHP hulp

08/05/2021 15:56:53
 
Erwin H

Erwin H

18/04/2012 18:22:57
Quote Anchor link
Weet je wat binair is? Wat decimaal is? Wat hexadecimaal is?
En voornamelijk hoe je van een decimaal getal naar bijvoorbeeld een hexadecimaal getal gaat?
Nu, stel dat je nu een stelsel hebt voor 62 (0-9a-zA-Z). Dan worden de decimale getallen in dst stelsel dus:
0 - 0
9 - 9
10 - a
11 - b
60 - Y
61 - Z
62 - 10
63 - 11
123 - 1Z
124 - 20
Zo kan je dus al een heel eind verder gaan en toch gewoon je auto_increment gebruiken in je database.
 
Wouter De Schuyter

Wouter De Schuyter

18/04/2012 18:52:35
Quote Anchor link
Dat heb ik ook net gezien, maar er zijn er die claimen tot 12.000.000 te kunnen gaan met 4 chars, dat kan niet met hexadecimaal :/
 
Erwin H

Erwin H

18/04/2012 19:02:10
Quote Anchor link
Ik had het ook niet over hexadecimaal, maar een stelsel met 62 karakters (sorry, ik heb daar geen naam voor) en 62 tot de 4e = 14.776.336
Dat komt wel aardig in de buurt volgens mij...
 
Jurgen B

Jurgen B

18/04/2012 19:08:14
Quote Anchor link
Dat is inderdaad wat ik ook wilde zeggen (had Erwins reactie ook verkeerd gelezen in eerste instantie). Op die manier ben je wel even bezig voor je aan je 5e character zit.
 
Wouter De Schuyter

Wouter De Schuyter

18/04/2012 19:24:40
Quote Anchor link
Ok nu ben ik mee..
Maar hoe wil je die juist genereren en checken of ze al bestaan?
 
Jurgen B

Jurgen B

18/04/2012 19:44:18
Quote Anchor link
Als je weet hoe je van decimaal naar hexadecimaal (16 tallig stelsel) gaat kan je deze methode ook toepassen op een 62 tallig stelsel. Bij een nieuwe aanvraag voer je een nieuwe regel in de database en zet je het nieuwe id om naar je 62 tallig stelsel. Om te kijken of de url al bestaat zal je denk ik letterlijk op de url moeten zoeken, maar misschien denk ik te moeilijk en is er een efficienter/makkelijker alternatief.
Gewijzigd op 18/04/2012 19:44:45 door Jurgen B
 
Erwin H

Erwin H

18/04/2012 19:44:30
Quote Anchor link
Je kan gewoon een auto_increment laten lopen in je database die je omrekent naar een 4 karakter string. Op zich niet zo moeilijk, hoewel je wel even wat tijd zal moeten besteden aan hoe je van een getal naar de juiste letter gaat.
 
- SanThe -

- SanThe -

18/04/2012 23:02:32
Quote Anchor link
Jurgen B op 18/04/2012 19:44:18:
... kan je deze methode ook toepassen op een 62 tallig stelsel ...


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
function omrekenen($getal, $soort, $return = '')
{

    $chars = array_merge(range('0','9'),range('a','z'),range('A','Z'));
    switch($soort)
    {
        case
10:    if($getal > 61)
                    {

                        $return .= omrekenen(floor($getal / 62), $soort, $return);
                    }

                    $return .= $chars[($getal) % 62];
                    return $return;
        case
62:    for($i=0; $i<strlen($getal); $i++)
                    {

                        $search = (ord($getal[$i]) < 64) ? ord($getal[$i])-48 : $getal[$i];
                        $return += pow(62, strlen($getal)-$i-1) * array_search($search, $chars, true);
                    }

                    return $return;
        default:
    return 'Error';
    }
}


$random = rand(0,14776335);
$code = omrekenen($random, 10);
$getal = omrekenen($code, 62);
echo $random . ' => ' . $code . ' => ' . $getal . '<br />';
?>
 
Chris -

Chris -

18/04/2012 23:20:41
Quote Anchor link
Netjes SanThe :)
 
Wouter De Schuyter

Wouter De Schuyter

19/04/2012 09:56:05
Quote Anchor link
De oplossing van SanThe is dan nog de beste, want als ik dechex() gebruik op het ID kan je URL voorspellen..

MAAR

Stel ik heb 13.000.000 links gegeneerd met het script van SanThe.. Dan heb je 90% kans dat de URL al bestaat, hoe los je dit op? Elke keer checken of hij al in de DB zit en indien wel opnieuw genereren?



Vb: bij het generen van 10K items heb ik al meteen 6 duplicates http://pastie.org/3815467
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
    set_time_limit(60);
    error_reporting(E_ALL);

    function
calculate($getal, $soort) {

        $return = '';
        $chars = array_merge(range('0','9'), range('a','z'), range('A','Z'));

        switch($soort) {
            case
10:
                if($getal > 61) {
                    $return .= calculate(floor($getal / 62), $soort, $return);
                }

                $return = $chars[($getal) % 62];

                return $return;
            break;

            case
62:
                for($i = 0; $i < strlen($getal); $i++) {
                    $search = (ord($getal[$i]) < 64) ? ord($getal[$i])-48 : $getal[$i];
                    $return += pow(62, strlen($getal)-$i-1) * array_search($search, $chars, true);
                }

                
                return $return;
            break;

            default:

                return false;
            break;
        }
    }




    $array = $found = array();

    for($j = 0; $j < 10000; $j++) {
        $string = '';
        for($i = 0; $i < 4; $i++) {
            $string .= calculate(rand(0,14776335), 10);
        }


        echo $string . " ";
        if(!in_array($string, $array)) {
            $array[] = $string;
        }

        else {
            $found[] = $string;
        }
    }


    echo "\n\n\n";

    echo "Found " . count($found) . " duplicates (" . round((count($found) / (count($found) + count($array))) * 100, 2) . "%) on " . (count($found) + count($array)) . " items.";
    echo "\n\n";
    echo "Duplicates: \n";

    foreach($found as $item) {
        echo $item . "\n";
    }

?>
Gewijzigd op 19/04/2012 10:44:46 door Wouter De Schuyter
 
- SanThe -

- SanThe -

19/04/2012 11:06:44
Quote Anchor link
@Wouter: Waarom heb je de function niet correct overgenomen? Zoals jij het nu hebt zal ie niet correct werken.
 
Chris -

Chris -

19/04/2012 11:50:53
Quote Anchor link
Je zou eventueel ook 25 miljoen verschillende codes in de database kunnen plaatsen, met een "in gebruik" veld waar je een key op zet. Tijdens het invoeren van een URL voer je een RAND() query uit op de tabel waar "in gebruik" false is.
 
Wouter De Schuyter

Wouter De Schuyter

19/04/2012 12:26:49
Quote Anchor link
SanThe: ziezo met jouw code, maar krijg (logisch) nog steeds duplicates :/

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
    set_time_limit(60);
    
    function
omrekenen($getal, $soort, $return = '')
    {

        $chars = array_merge(range('0','9'),range('a','z'),range('A','Z'));
        switch($soort)
        {
            case
10:    if($getal > 61)
                        {

                            $return .= omrekenen(floor($getal / 62), $soort, $return);
                        }

                        $return .= $chars[($getal) % 62];
                        return $return;
            case
62:    for($i=0; $i<strlen($getal); $i++)
                        {

                            $search = (ord($getal[$i]) < 64) ? ord($getal[$i])-48 : $getal[$i];
                            $return += pow(62, strlen($getal)-$i-1) * array_search($search, $chars, true);
                        }

                        return $return;
            default:
    return 'Error';
        }
    }




    $array = $found = array();
    for($j = 0; $j < 10000; $j++) {
        $string = omrekenen(rand(0,14776335), 10);

        echo $string . " ";
        if(!in_array($string, $array)) {
            $array[] = $string;
        }

        else {
            $found[] = $string;
        }
    }


    echo "\n\n\n";

    echo "Found " . count($found) . " duplicates (" . round((count($found) / (count($found) + count($array))) * 100, 2) . "%) on " . (count($found) + count($array)) . " items.";
    echo "\n\n";
    echo "Duplicates: \n";

    foreach($found as $item) {
        echo $item . "\n";
    }

?>


@Chris: zou dat de correcte oplossing zijn? Zou het zo zijn dat bit.ly het bv doet? Lijkt mij nogal omslachtig..
Gewijzigd op 19/04/2012 12:46:18 door Wouter De Schuyter
 
Kees Schepers

kees Schepers

19/04/2012 12:36:55
Quote Anchor link
Ik zou het ook met noSQL opslaan, met MySQL ga je denk ik wel performance problemen krijgen nadat je een paar tientallen miljoenen url's erin hebt staan ;)
 
- SanThe -

- SanThe -

19/04/2012 14:52:26
Quote Anchor link
Zo krijg je geen duplicates meer:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    for($j = 0; $j < 10000; $j++) {
        $string = omrekenen(rand(0,14776335), 10);

        echo $string . " ";
        if(!in_array($string, $array)) {
            $array[] = $string;
        }

        else {
            $j--;
        }
    }

?>
Gewijzigd op 19/04/2012 14:52:46 door - SanThe -
 
Wouter De Schuyter

Wouter De Schuyter

19/04/2012 15:25:54
Quote Anchor link
@Kees wat zou dat voor problemen kunnen geven? MySQL?

@SanThe: hehe, dat is waar. Maar ik ga niet alle hashes uit de DB laden in een array en dan kijken of ze in die array zitten of wel? Stel dat je 14 miljoen records hebt kan dat niet echt performant zijn?
 
- SanThe -

- SanThe -

19/04/2012 15:34:04
Quote Anchor link
Als het in een database staat zou ik het zo ongeveer doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
do
{
    // genereer code
    // SELECT code

}
while (mysql_num_rows() == 1);
// INSERT code
?>
 
Gerhard l

gerhard l

19/04/2012 15:34:54
Quote Anchor link
Ik gebruik de manier van Chris Horeweg tot zover loopt het vloeiend (nog maar 900 urls verkort).
Maar ik denk dat de query wel sneller is dan alle bij langs lopen en kijken of ze al bestaan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT short_code FROM short_list WHERE used='0'  ORDER BY RAND() LIMIT 1
Gewijzigd op 19/04/2012 15:35:28 door gerhard l
 
Kees Schepers

kees Schepers

19/04/2012 15:40:20
Quote Anchor link
Wouter DS op 19/04/2012 15:25:54:
@Kees wat zou dat voor problemen kunnen geven? MySQL?


Omdat je met MySQL veel sneller en lastiger moet opschalen als je tientallen miljoenen URL's opslaat. Tevens zal het niet goed performen als je over miljoenen URL's stats gaat genereren.
 
Pim -

Pim -

19/04/2012 15:40:27
Quote Anchor link
Je kan evt nog een hash toevoegen aan de string, zodat het moeilijk/lastig wordt URLs te raden.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function encode($id, $hashSize = 100)
{

    $privateKey = 16546354324; // Moet je even checken wat de MAX_LONG waarde is
    $num = $id * $hashSize + ($id * $privateKey) % $hashSize;
    return base_convert($num, 10, 62);
}
function
decode($string, $hashSize = 100)
{

    $privateKey = 16546354324;
    $num = (int) base_convert($string, 62, 10);
    $hash = $num % $hashSize;
    $id = ($num - $hash) / $hashSize;
    if($hash != ($id * $privateKey) % $hashSize)
        return false; // Foute hash
    return $id;
}

?>

Door hashSize te variëren kan je je URL veiliger maken. hashSize = 100 betekent dat je max 100 pogingen nodig hebt om de URL te gokken als je het ID weet.

Deze code werkt trouwens niet omdat base_convert maart to base 36 gaat, maar het idee lijkt me duidelijk.


Toevoeging op 19/04/2012 15:41:49:

@Kees,
Maar noSQL is dan toch niet per se de beste vervanging? Een simpele key->value DB lijkt me een stuk nuttiger.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.