Forstå Base-36 Math

Mitt navn er 13 tegn langt. Det er mange DeWolfes, mange Shawns, noen Shawn DeWolfes. Min 13 tegn navn betyr ikke noe unikt. Selv mitt nifsifrede sosialforsikringsnummer går bare så langt. I mitt land, Canada, definerer det meg spesielt, men en hvilken som helst annen nasjon med et siffersifret sosialforsikringsnummersystem vil trolig få et medlem med et nummer det samme som min egen.

Hva om ett tall kan adressere hver person i live, være kortere enn et navn og kortere enn et sosialt forsikringsnummer? Du kan ikke gjøre det med Base-10-tall, men med Base-36 er det en bris.

Vi bruker base ti så mye at vi reduserer bruken av å gå opp med ordre på ti med hvert siffer vi legger til i et nummer. Med to siffer kan vi gå fra 0 til 99. Hexadecimal tar det videre: med to heksadesimale siffer, kan vi komme til 255 - fra 0 til FF. 

Heksadesimale tall kommer over tsifret mark uten å måtte oppfinne nye tall. Det gjør dette ved å bruke A, B, C, D, E og F til å referere til 11. til 16. digital. Base-36 tar det ett skritt videre og bruker alle de konvensjonelt tilgjengelige tegnene vi er kjent med. Base-36 bruker tall for å håndtere de første ti sifrene. Tallene 11 til 36 er referert til med alfabetet fra A til Z. Vi vet rekkefølgen på tall fra 0 til 9, og vi vet alfabetet, slik at vi kan forutse fremdriften.


Ved å bruke basis-36-nummeret kan massivt større tall refereres til med en økonomi av størrelse. Mens et tosifret nummer får deg til 99; ZZ, et tosifret Base-36-uttrykk, kommer til 1295. Z, ZZZ, ZZZ er basen ti ekvivalent til 78.364.164.095. 

Med det syv sifre nummeret under base-36, kan du referere til hver person i live og nesten hver person som levde med sitt eget unike 7-sifrede nummer. 

Når du kommer til åtte sifre, kan du få Internett til å dekke ting. Åtte sifre ved base-36 teller til over to billioner (2,821,109,907,455 for å være eksakt).

Base-36 er et godt praktisk tak for å jobbe med i stedet for base ti eller en heksadesimale sekvens. PHP og MySQL har konverteringsfunksjoner som kan konvertere tall til og fra base-36. Funksjonaliteten er der. Det muliggjør lagring av mer kompakte data. 

Fra det menneskelige perspektiv har det blitt sagt at mange mennesker kan huske en liste over 5 ting pluss eller minus to. Mange kan huske viktige telefonnumre. Og akkurat som de fleste kan hente et syv sifret telefonnummer, kan det hevdes at de kan beholde en sju tegnstrengsrepresentasjon av noe stort - i stedet for et telefonnummer på 1 til en million, en sju tegnbase-36 figur representerer en av 78 milliarder referanser.   

Hvorfor er store tall viktige?

Som vist ovenfor kan store numre være nyttige for å håndtere store datamengder. Facebook lagrer innleggene sine med ID-numre som spiraler oppover. 

Et innlegg jeg nettopp har trukket har ID-nummeret til 902352183124757. Femten sifre - 902 billioner. Hvis de er på 902 billioner, og en fyr som meg kaster i en gal mengde innlegg per dag, og titalls millioner gjør som jeg gjør, vil det postmåleret rulle snart. 

Hvis innleggene var formatert til å være 10 basis-36 siffer, ville databasen ha flere benrom (f.eks. Nesten 4 quadrillion (3 656 152 484 062 980) referanser tilgjengelig). Hvis Facebook kom til dette punktet gjennom eksponensiell vekst og at eksponensiell vekst utjevner, bør 2 + quadrillion-innlegg gi databasen rommet det trenger for å referere til nye innlegg uten å gå til en googolplex-verdi.

Er ikke Base-36 Numbers Processing Intensive?

Ja og nei. Inne i en database er heltal den mest økonomiske måten å lagre data på. Base-36-tallene vil bli betraktet som strenge og strenger er dyrere lagring. 

På samme måte vil automatisk inkrement i MySQL bare øke heltall. Du kan formatere strenger for å være konsistente. For eksempel kan alle 10 tegn brukes med nuller til venstre for nummeret slik at 0000000008 ville være åtte mens 00000000ZZ ville være 1295. Når det ble sortert alfabetisk, ville progresjonen se ut som en numerisk progresjon. Mens automatisk inkrementering er innebygd i MySQL og de fleste andre relasjonsdatabaser, er det ikke det eneste spillet i byen. Du kan opprette nye automatisk genererte base-36 tall ved å knytte en trigger til et bord (som vi diskuterer kort tid) for å introdusere nye ordnede verdier når nye poster blir satt inn.

Hvor Base-36 kan brukes

Målet med base-36 er komprimering og relevans. I stedet for 10 siffer som refererer til menneskene på jorden, vil syv tegn adressere dem alle. I stedet for 16 sifre for å adressere alle Facebooks statusoppdateringer noensinne, kan 10 tegn brukes. Når det gjelder relevans, kan sekvensen både være en stigende verdi og noe av verdien kan settes til side for å erklære ytterligere kvaliteter i det som blir definert.

Base-36 kan brukes til å referere til disse typer elementer:

  • Mennesker. Et syv sifret base-36 nummer kan referere til 78 milliarder mennesker. Hvis du konverterer en brukers referanse til 7 tegn.
  • Landskoder. Landskoder er allerede to tegnrepresentasjoner. Det er 193 anerkjente land (ved å skrive det, jeg vet bare at et land skal splitte seg inn i to når jeg kommer til tett braketten). ISO-3166-standarden er en liste over tosifrede landskoder. Med to alfabetiske tegn kan 676 spesifikke land refereres, landskoder er gode til å bruke bare to tegn. Ved å bruke ISO-3166-standarden går over 400 referanser ubrukt, men det gir fortsatt en felles og gjenkjennelig referanse.
  • byer. Kina, med en milliard mennesker, har over 1020 byer. Disse samfunnene kan refereres inne i to basis-36 siffer. Mange land har færre enn 1000 samfunn. La oss si at fellesskapsreferanser blir veldig spesielle og for å tilfredsstille alle referansene, tre siffer kan knytte 46.655 samfunn inne i ett land.
  • enheter. Tingenes Internett kommer, jeg er sikker. Jeg har tre enheter med egne trådløse behov. Noen teknologiske mennesker kunne ha mange flere kablede enheter. Hvis dette var 36 enheter per person, kunne ett siffer dekke av alle disse enhetene. To sifre til referanseenheter og ting dekker av 1295 muligheter.

Amalgamert serienummer

Disse strengene kan kombineres for å gjøre unike ved å kombinere tegnene i en ordnet rekkefølge. I det følgende eksemplet kan du gjøre en referanse til folk, deres plassering og deres enheter. Hele strengen kan være unik, mens elementer deri gjentar.

For eksempel: US001200GHK4 kan faktisk bety:

  • US - landskode
  • 001 - Manhattan
  • 200GHK4 - En persons unike kode.

Kanskje deres enheter blir lagt til identifikasjonsprosessen. La oss si at bærbar PC er deres primære enhet. Når mobiltelefonen legges inn i figuren, er den den andre enheten som er knyttet til brukeren: US001200GHK42. "2" står for den andre enheten.

Hvis det var hvordan basen-36 ble jobbet for å skape noe identifikasjon, vil lengden på strengen snakke med det det forbinder.

  • To sifre lang = land med ISO-3166 standardkoder
  • Fem sifre lang = samfunn i et land
  • Tolv siffer lenge = en person som de bor i et land
  • Tretten cifre lang = en referanse til en IP-adresserbar enhet eid av en bruker i et bestemt samfunn og land.

Med 13 siffer vil en MySQL-søk etter "US%" for returnere alle amerikanske statsborgere. "US001%" vil returnere alle menneskene på Manhattan. "US001% 1" vil avsløre den primære / foretrukne enheten som brukes av alle disse Manhattan-beboerne. Med en logikk slik, kan kommunikasjon rutet til en foretrukket del av et nettverk.

Selvfølgelig er det mye av hva om:

  • Hva om de bytter byer? Den tredje til femte tegn endres.
  • Hva om de hopper til et annet land? De fem første sifrene endres for å reflektere nye graver.
  • Hva om de eier mer enn 36 enheter? Hvis det skjer, kan de to siste sifrene representere enheten sin i stedet for bare den siste - en fjorten cifret ID # ville si, "denne fyren har mange gadgets."

Lagring i en database

Hovedformålet med å skape disse store tallene og lagre dem som basis-36 referanser er å øve en slags økonomi. Disse må være sekvensielle som indeksnøkler, men du trenger ikke å gjøre noen bestemt matte med dem.

I MySQL, base-36 strenger lagret som VARCHAR Datatyper oppfører seg som heltall. Strengene kan sammenlignes med aggregatfunksjoner som MAX () og MIN () for å få de høyeste og laveste tilgjengelige tallene, henholdsvis. 

Du kan også hente en base-36-streng ved å sortere i synkende rekkefølge for å få det høyeste nummeret først. Til forskjell fra heltall kan base-36-strenger filtreres med SOM uttalelser bør strengene være en kombinasjon av sammenslåtte serier og økende verdier.

Bruke verdier i MySQL

I MySQL er det CONV () funksjon som kan konvertere fra alt fra en base-2 til et base-36 nummer. For å få en base-36 til sin base 10 ekvivalent, gjør CONV ('ZA', 36, 10). For å få den fra en base 10 over til en base-36 kan du gå den andre veien. CONV ('1294', 10, 36). Du kan hekke disse funksjonene for å skape noe som øker: CONV (CONV ('ZA', 36, 10) + 1, 10, 36)  vil sende 'ZB.'

Økende Base-36 Keys i MySQL

Dette kan settes inn i en tilpasset prosedyre, og denne prosedyren kan utløses når nye poster blir satt inn i en databasetabell. I eksemplet nedenfor blir utløseren lagt til base_example tabell for å utføre og opprette en base-36-nøkkel når en ny plate legges til base_example-tabellen.

CREATE TABLE IF NOT EXISTS 'base_example' ('bkey' varchar (12) IKKE NULL, 'info' tekst IKKE NULL) ENGINE = InnoDB DEFAULT CHARSET = latin1; CREATE TRIGGER 'b36_incr' FØR INSERT PÅ 'base_example' FOR HVER RAD BEGIN DECLARE old_bkey VARCHAR (12); DECLARE rowcount INT; VELG COUNT (*), bkey til rowcount, old_bkey FROM 'base_example' GROUP BY bkey BESTILL BY 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øst prosedyre for å opprette og øke verdien.

I dette eksemplet er det to forutsetninger lagt til blandingen. Først VARCHAR feltet skal være 12 tegn langt. For det andre, verdiene i VARCHAR feltet er venstrepolstret med nuller slik at alle utgangene ser konsekvent ut og kan sorteres på en forutsigbar måte.

Math med Base-36

Base-36 er kult, men de fleste språk refererer fortsatt til ting i base 10 og binære. PHP kan imidlertid foreta grunnkonverteringer, men det er klokt nok til å ekstrapolere bokstavene A til og med Z dekke det 11. til 36. sifre. 

Med en enkel funksjon, kan basis-36-tall passeres en funksjon (som vi ser kort tid) for konvertering, beregning og returverdi. Det gjør dette ved å trekke 0-9A-Z tegnene fra formelen, utføre en basis-36 beregning og deretter konvertere utgangen tilbake til base-36.

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

Gjøre Base-36 Formler i PHP

Det er en grense for hvor komplisert matematikken er, men jeg skrev et eksempelfunksjon b36math () som konverterer en base-36 formel til et basis-36 resultat.

"; skriv ut b36math (" ZW + 9 "); skriv ut"
"; funksjon b36math ($ formula =" ") $ out = preg_replace_callback (" / ([\ w] +) / "," b36convert ", $ formel); // incr / decr virker ikke som annonsert $ ut = str_replace ("++", "+ 1", $ ut); $ out = str_replace ("-", "- 1", $ ut); eval ('$ outer ='. $ ut ';' ), returner strtoupper (base_convert ($ ytre, 10, 36)); funksjon b36convert ($ matches) $ cif = ""; array_shift ($ matches); foreach ($ matcher som $ key => $ match) $ sifre. = $ match; $ new_number = base_convert ($ siffer, 36, 10); return intval ($ new_number);?>

Figur 2. B36math-konverteringsfunksjonen for å utføre funksjoner utført med basis-36-tall.

Konklusjon

Vår verden er data sulten. Disse dataene må være godt referert. I klemmen for å få tilgang til større datatyper, bruker henvisninger som er lagret som base-36 tall, en måte å lagre større tall på mindre plass. 

Det er et fotspor til hva som er en verdifull vare: prosesshastighet, båndbredde eller lagring. Når man er i generøs forsyning, kan du bruke den til å kompensere for den andre. Hvis du har mange tilgjengelige sykluser for behandling, kan du lagre data i et besværlig format og bruke behandling for å gjøre det brukbart.. 

Mens det er en kapsel på hvor mange siffer som kan refereres i et heltall, varchar Felter kan gå til 255 tegn, og tekstfeltene er åpne. Svært store base-36-numre kan lagres for å referere til enkelte elementer i svært store datakilder.