sql >> Database teknologi >  >> RDS >> Mysql

indeks på url eller hashing i betragtning af RAM

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 .

  1. 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.

  2. 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 :).




  1. Hvordan konfigureres DbContext til at arbejde med Oracle ODP.Net og EF CodeFirst?

  2. Indsæt til alle celler, når poster er mere end én PHP

  3. Laravel veltalende gruppe efter seneste rekord

  4. SAP Lumira og JDBC-ODBC Bridge