Efter at have læst alle dine spørgsmål ( unik begrænsning gør hashes ubrugelige? , 512 bit hash vs 4 128bit hash og url-tekstkomprimering (ikke forkortelse ) og lagring i mysql ), Jeg forstod, at dit problem er mere eller mindre følgende:
Er det det?
Følgende punkter er vigtige:Hvordan er formatet på den URL, du vil gemme? Skal du læse URL'en tilbage eller bare opdatere oplysninger om den, men aldrig søge baseret på delvise URL'er osv.?
Forudsat URL ="http://www.somesite.com.tv/images/picture01 .jpg " og at du vil gemme alt, inklusive filnavnet. Hvis det er anderledes, bedes du give flere detaljer eller rette mine svarantagelser .
-
If kan spare plads ved at erstatte en gruppe af tegn i URL'en. Ikke alle ASCII-tegn er gyldige i en URL, som du kan se her:RFC1738 , så du kan bruge dem til at repræsentere (og komprimere) URL'en. For eksempel:Brug af tegn 0x81 til at repræsentere "http://" kan få dig til at gemme 6 tegn, 0x82 til at repræsentere ".jpg" kan spare dig yderligere 3 bytes osv.
-
Nogle ord kan være meget almindelige (såsom "billede", "billede", "video", "bruger"). Hvis du vælger at bruge tegnene 0x90 op til 0x9f + et hvilket som helst andet tegn (altså 0x90 0x01, 0x90 0x02, 0x90 0xfa) til at kode sådanne ord, kan du have 16 * 256 =4.096 "ordbogsindgange" til at kode de mest brugte ord. Du skal bruge 2 bytes til at repræsentere 4 - 8 tegn.
Rediger: som du kan læse i den nævnte RFC ovenfor, i URL'en kan du kun have de printbare ASCII-tegn. Dette betyder, at kun tegnene 0x20 til 0x7F skal bruges, med nogle observationer lavet i RFC. Så ethvert tegn efter 0x80 (hexadecimal notation, ville være tegn 128 decimal i ASCII-tabellen) bør ikke bruges. Så hvis kan vælge ét tegn (lad os sige 0x90) til at være ét flag for at indikere "følgende byte er en indikation i ordbogen, indekset jeg vil bruge". Et tegn (0x90) * 256 tegn (0x00 op til 0xFF) =256 poster i ordbogen. Men du kan også vælge at bruge tegnene 0x90 til 0x9f (eller 144 til 159 i decimal) for at angive, at de er et flag til ordbogen, hvilket giver dig 16 *256 muligheder...
Disse 2 metoder kan spare dig for en masse plads i din database og er reversible, uden at du behøver at bekymre dig om kollisioner osv. Du kan nemt oprette en ordbog i din applikation og indkode/afkode URL'er ved hjælp af den, meget hurtigt, hvilket gør din database meget lettere.
Da du allerede har +50 millioner URL'er, kan du generere statistik baseret på dem for at generere en bedre ordbog.
Brug af hashes :Hashes, i dette tilfælde, er en afvejning mellem størrelse og sikkerhed. Hvor slemt vil det være, hvis du får en kollision? Og i dette tilfælde kan du bruge fødselsdagsparadokset a> for at hjælpe dig.
Læs artiklen for at forstå problemet:Hvis alle input (mulige tegn i URL'en) var ækvivalente, kunne du stimulere sandsynligheden for en kollision. Og kunne beregne det modsatte:givet din acceptable kollisionssandsynlighed og dit antal filer, hvor bredt skal dit rækkevidde være? Og da dit interval er nøjagtigt relateret til antallet af bits genereret af hash-funktionen...
Rediger: hvis du har en hash-funktion, der giver dig 128 bit, har du 2^128 mulige udfald. Så dit "interval" i fødselsdagsparadokset er 2^128:det er som om dit år har 2^128 dage i stedet for 365. Så du beregner sandsynligheden for kollision ("to filer at være født på samme dag med et år der har 2^128 dage i stedet for 365 dage). Hvis du vælger at bruge en hash, der giver dig 512 bit, vil dit interval gå fra 0 til 2^512...
Og igen, husk RFC'en:ikke alle bytes (256 tegn) er gyldige i internet-/URL-verdenen. Så sandsynligheden for kollisioner falder. Bedre for dig :).