Förstå bas-36 matematik

Jag heter 13 tecken långt. Det finns massor av DeWolfes, massor av Shawns, några Shawn DeWolfes. Mitt 13 tecken namn betyder inte någonting unikt. Även mitt nio siffriga sociala försäkringsnummer går bara så långt. I mitt land, Kanada, definierar jag mig specifikt, men någon annan nation med ett nio siffrigt socialförsäkringsnummersystem kommer sannolikt att ha en medlem med ett nummer som är mitt som mitt eget.

Vad händer om ett nummer skulle kunna adressera varje person som levande, vara kortare än ett namn och kortare än ett socialförsäkringsnummer? Du kan inte göra det med Base-10-nummer, men med Base-36 är det en bris.

Vi använder bas tio så mycket att vi diskonterar nyttan av att gå upp med tio order med varje siffra vi lägger till ett nummer. Med två siffror kan vi gå från 0 till 99. Hexadecimal tar det längre: med två hexadecimala siffror kan vi komma till 255 - från 0 till FF. 

Hexadecimala siffror kommer över tiofemsmarkeringen utan att behöva uppfinna nya nummer. Det gör det genom att använda A, B, C, D, E och F för att referera till 11: e till 16: e digitalen. Base-36 tar det ett steg längre och använder alla de konventionellt tillgängliga tecknen vi är bekanta med. Bas-36 använder siffror för att hantera de första tio siffrorna. Siffrorna 11 till 36 är refererade till alfabetet från A till Z. Vi vet ordningen av siffror från 0 till 9, och vi vet alfabetet, så vi kan förutse progressionen.


Genom att använda bas-36-numret kan massivt större siffror refereras med en ekonomi av storlek. Medan ett tvåsiffrig nummer får dig till 99; ZZ, ett tvåsiffrigt Base-36 uttryck blir 1295. Z, ZZZ, ZZZ är basen tio ekvivalent av 78.364.164.095. 

Med det siffrigs siffran under bas-36 kan du referera varje levande person och nästan varje person som någonsin levde med sitt eget unika 7-siffriga nummer. 

När du kommer till åtta siffror kan du få Internet till saker som omfattas. Åtta siffror vid bas-36 räknas till över två biljoner (2,821,109,907,455 för att vara exakt).

Base-36 är ett bra praktiskt tak för att arbeta med i stället för bas tio eller en hexadecimal sekvens. PHP och MySQL har konverteringsfunktioner som kan konvertera nummer till och från bas-36. Funktionen finns där. Det möjliggör lagring av mer kompakta data. 

Ur det mänskliga perspektivet har man sagt att många människor kan komma ihåg en lista med 5 saker plus eller minus två. Många kan komma ihåg viktiga telefonnummer. Och precis som de flesta kan komma ihåg ett siffrig telefonnummer, så kan man hävda att de kan behålla en sju teckensträngsrepresentation av något stort - i stället för ett 1-i-ett-miljoner telefonnummer, en sju bokstäver-36 siffran kommer att representera en av 78 miljarder referenser.   

Varför är stora nummer viktigt?

Som visas ovan kan stora nummer vara praktiska för att hantera stora datamängder. Facebook lagrar sina inlägg med ID-nummer som spiraler uppåt. 

Ett inlägg som jag just drog har ID-numret på 902352183124757. Femton siffror - 902 biljoner. Om de är 902 biljoner, och en kille som jag kastar i en galen mängd inlägg per dag och en tiotals miljoner gör som jag gör, kommer den här posten att rulla över snart. 

Om posterna formaterades till 10 bas-36 siffror, skulle databasen ha mer benrum (t.ex. nästan 4 quadrillion (3 656 158 484 062 980) referenser tillgängliga). Om Facebook kom till denna punkt genom exponentiell tillväxt och den exponentiella tillväxten utjämnar, då 2 + quadrillion-inlägg ska ge databasen det rum den behöver för att referera till nya inlägg utan att gå till ett googolplex-värde.

Är inte Bas-36 Numbers Processing Intensive?

Ja och nej. Inne i en databas är heltal det mest ekonomiska sättet att lagra data. Bas-36 siffror skulle anses strängar och strängar är dyrare lagring. 

På samma sätt kommer automatisk inkrement i MySQL bara att öka heltal. Du kan formatera strängar för att vara konsekventa. Till exempel kan alla 10 tecken användas med nollor till vänster om numret så att 0000000008 skulle vara åtta medan 00000000ZZ skulle vara 1295. När det sorterades alfabetiskt skulle progressionen se ut som en numerisk progression. Medan automatisk inkrementering är inbyggd i MySQL och de flesta andra relationsdatabaser är det inte det enda spelet i stan. Du kan skapa nya automatiskt genererade bas-36-nummer genom att associera en utlösare till en tabell (som vi diskuterar tillfälligt) för att införa nya ordnade värden när nya poster läggs in.

Där Base-36 kan användas

Målet med bas-36 är komprimering och relevans. I stället för 10 siffror som refererar till folket på jorden, kommer sju tecken att adressera dem alla. I stället för 16 siffror för att ta itu med alla Facebook-statusuppdateringarna någonsin kan 10 tecken användas. När det gäller relevans kan sekvensen vara både ett inkrementellt värde och en del av värdet kan sättas åt sidan för att deklarera ytterligare kvaliteter i vad som definieras.

Bas-36 kan användas för att referera till följande typer av objekt:

  • människor. En siffrig bas-36-nummer kan referera till 78 miljarder personer. Om du konverterar en användares referens till 7 tecken.
  • Landskoder. Landskoder är redan två teckenrepresentationer. Det finns 193 erkända länder (genom att skriva det, jag vet bara att ett land kommer att delas in i två när jag kommer till nära hållaren). ISO-3166-standarden är en lista med tvåciffriga landskoder. Med två alfabetiska tecken kan 676 specifika länder refereras, landskoder är bra på att använda bara två tecken. Med ISO-3166-standarden lämnas över 400 referenser oanvända, men det ger fortfarande en gemensam och genkänlig referens.
  • städer. Kina, med dess en miljard människor, har över 1020 städer. Dessa samhällen kan refereras inuti två bas-36 siffror. Många länder kommer att ha färre än 1000 samhällen. Låt oss säga att gemenskapsreferenser blir riktigt specifika och att uppfylla alla referenser, tre siffror kan associera 46.655 samhällen inuti ett land.
  • enheter. Dina Internet kommer, jag är säker. Jag har tre enheter med egna trådlösa behov. Vissa teknikvänliga människor kan ha många fler kablade enheter. Om det här var 36 enheter per person, kunde en siffra täcka alla dessa enheter. Två siffror till referensapparater och saker täcker 1295 möjligheter.

Amalgamerade serienummer

Dessa strängar kan kombineras för att göra unika genom att kombinera karaktärerna i en ordnad sekvens. I följande exempel kan du hänvisa till personer, deras plats och deras enheter. Hela strängen kan vara unik medan element däri upprepas.

Till exempel: US001200GHK4 kan faktiskt betyda:

  • USA - landskod
  • 001 - Manhattan
  • 200GHK4 - En persons unika kod.

Kanske deras enheter läggs till i identifieringsprocessen. Låt oss säga att den bärbara datorn är deras primära enhet. När deras mobiltelefon sätts i figuren är det den andra enheten som är associerad med användaren: US001200GHK42. "2" står för den andra enheten.

Om det är hur basen 36 arbetade för att skapa någon identifiering, talar längden på strängen med vad den associerar.

  • Två siffror långa = Land med ISO-3166-standardkoderna
  • Fem siffror långa = gemenskap i ett land
  • Tolv siffror långa = en person som de bor i ett land
  • Tretton siffror lång = en referens till en IP-adresserbar enhet som ägs av en användare i ett visst samhälle och land.

Med 13 siffror kommer en MySQL-sökning efter "US%" för att returnera alla amerikanska medborgare. "US001%" kommer att returnera alla människor på Manhattan. "US001% 1" kommer att avslöja den primära / föredragna enheten som används av alla dessa Manhattan invånare. Med en logik så kan kommunikationen dirigeras till en föredragen bit av ett nätverk.

Självklart finns det massor av vad om:

  • Vad händer om de byter städer? Den tredje till femte bokstaven ändras.
  • Vad händer om de hoppar till ett annat land? De fem första siffrorna ändras för att återspegla nya grävningar.
  • Vad händer om de äger mer än 36 enheter? Om det händer kan de två sista siffrorna representera sin enhet istället för enbart den sista - en fjorton siffrig ID # skulle säga, "den här mannen har många prylar."

Lagring i en databas

Huvudsyftet med att skapa dessa stora nummer och lagra dem som bas-36 referenser är att öva en slags ekonomi. Dessa måste vara sekventiella som indexnycklar, men du behöver inte göra någon särskild matematik med dem.

I MySQL lagras bas-36 strängar som VARCHAR datatyper beter sig som heltal. Strängarna kan jämföras med aggregatfunktioner som MAX () och MIN () för att få de högsta respektive lägsta tillgängliga siffrorna. 

Du kan också hämta en bas-36-sträng genom att sortera i fallande ordning för att få det högsta numret först. Till skillnad från heltal kan bas-36 strängar filtreras med TYCKA OM uttalanden bör strängarna vara en kombination av sammanslagna serier och ökande värden.

Använda värden i MySQL

I MySQL finns det CONV () funktion som kan konvertera från allt från en bas-2 till ett bas-36-nummer. För att få en bas-36 till sin bas 10 ekvivalent, gör CONV ('ZA', 36, 10). För att få den från en bas 10 till en bas-36 kan du gå åt andra hållet. CONV ('1294', 10, 36). Du kan härda dessa funktioner för att skapa något som ökar: CONV (CONV ('ZA', 36, 10) + 1, 10, 36)  kommer att mata ut 'ZB.'

Öka bas-36 nycklar i MySQL

Detta kan sättas in i ett anpassat förfarande och det här förfarandet kan utlösas när nya poster läggs in i en databas tabell. I exemplet nedan läggs avtryckaren till base_example tabell för att exekvera och skapa en bas-36-tangent när en ny post läggs till i base_example-tabellen.

SKAPA TABELL OM DET INTE EXISTERAR 'base_example' ('bkey' varchar (12) INTE NULL, 'info' text INTE NULL) MOTOR = InnoDB DEFAULT CHARSET = latin1; SKAPA TRIGGER 'b36_incr' INNAN INSERT PÅ 'base_example' FÖR VARJE RÅD BEGIN DECLARE old_bkey VARCHAR (12); DECLARE rowcount INT; VÄLJ COUNT (*), bkey in rowcount, old_bkey FRÅN 'base_example' GROUP BY bkey BESTÄLL AV bkey DESC LIMIT 1; IF (1 <= rowcount) AND (old_bkey IS NOT NULL) THEN SET new.bkey = LPAD(CONV(CONV(old_bkey, 36, 10) + 1, 10, 36), 12, '0'); ELSE SET new.bkey = LPAD('0', 12, '0'); END IF; END

Figur 1. En utlösad procedur för att skapa och öka värdet.

I detta exempel finns två antaganden till blandningen. Först, det VARCHAR fältet måste vara 12 tecken långt. För det andra, värdena i VARCHAR Fältet är vänsterpolstret med nollor så att alla utsignaler ser konsekvent ut och kan sorteras på ett förutsägbart sätt.

Math med Base-36

Bas-36 är cool, men de flesta språk refererar fortfarande till saker i bas 10 och binär. PHP kan dock göra basomvandlingar men det är klokt att extrapolera bokstäverna A till och med Z täcker den 11: e till 36: e siffrorna. 

Med en enkel funktion kan bas-36-siffror ges en funktion (som vi ser tillfälligt) för konvertering, beräkning och returvärde. Det gör detta genom att dra 0-9A-Z-tecknen från formeln, utföra en bas-36-beräkning och sedan konvertera utgången tillbaka till bas-36.

$ bthreesix = "ZZ"; // basen 10 ekvivalent av 1295 $ zz = base_convert ($ bthreesix, 36,10); $ Zz ++; // ZZ blir 100 $ bthreesix = base_convert ($ zz, 10,36); echo $ bthreesix;

Gör bas-36-formulär i PHP

Det finns en gräns för hur komplex matematiken är, men jag skrev ett exempelfunktion b36math () som omvandlar en bas-36 formel till ett bas-36 resultat.

"; skriv ut b36math (" ZW + 9 "); skriv ut"
"; funktion b36math ($ formula =" ") $ out = preg_replace_callback (" / ([\ w] +) / "," b36convert ", $ formel); // incr / decr fungerar inte som annonserad $ ut = str_replace ("++", "+1", $ ut); $ out = str_replace ("-", "- 1", $ ut); eval ('$ outer ='. $ out ';' ), returnera strtoupper (base_convert ($ outer, 10, 36)); funktion b36convert ($ matchningar) $ cif = ""; array_shift ($ matchningar); foreach ($ matcher som $ key => $ matchning) $ siffror. = $ match; $ new_number = base_convert ($ siffror, 36, 10); returnera intval ($ new_number);?>

Figur 2. Funktionen b36math-omvandling för att utföra funktioner som exekveras med bas-36-nummer.

Slutsats

Vår värld är data hungrig. Dessa data måste väl refereras. Med hjälp av referenser som lagras som bas-36-nummer är det möjligt att lagra större antal i mindre utrymme när det gäller att få tillgång till större data. 

Det finns en fotavdelning till vad som är en värdefull produkt: bearbetningshastighet, bandbredd eller lagring. När man är i generös tillgång kan du spendera den för att kompensera för den andra. Om du har många tillgängliga cykler för bearbetning kan du lagra data i ett besvärligt format och använda bearbetning för att göra den användbar. 

Medan det finns ett kåp på hur många siffror kan refereras i ett heltal, varchar Fält kan gå till 255 tecken och textfält är öppna. Mycket stora bas-36-nummer kan lagras för att referera till enskilda element i mycket stora datakroppar.