Basis-36 wiskunde begrijpen

Mijn naam is 13 tekens lang. Er zijn veel DeWolfes, veel Shawns, een paar Shawn DeWolfes. Mijn 13-teken naam betekent niets unieks. Zelfs mijn negencijferige sofinummer gaat maar zo ver. In mijn land, Canada, definieert het mij specifiek, maar elk ander land met een negencijferig sofinummersysteem zal waarschijnlijk een lid hebben met een nummer dat hetzelfde is als dat van mijzelf.

Wat als één nummer elke levende persoon zou aanspreken, korter zou zijn dan een naam en korter dan een sociaal verzekeringsnummer? Je kunt het niet doen met Base-10-nummers, maar met Base-36 is het een koud kunstje.

We gebruiken zo veel basis tien dat we het nut van het verhogen van de waarde van tien afwaarderen met elk cijfer dat we aan een cijfer toevoegen. Met twee cijfers kunnen we gaan van 0 tot 99. Hexadecimaal gaat verder: met twee hexadecimale cijfers kunnen we 255 bereiken - van 0 naar FF. 

Hexadecimale getallen komen boven het tiencijferige cijfer zonder nieuwe nummers uit te vinden. Dit gebeurt door A, B, C, D, E en F te gebruiken als verwijzing naar de 11e tot de 16e digitalen. Base-36 gaat nog een stap verder en gebruikt alle conventioneel beschikbare personages waarmee we vertrouwd zijn. Base-36 gebruikt getallen om de eerste tien cijfers te verwerken. Cijfers 11 t / m 36 worden met het alfabet van A tot Z aangeduid. We kennen de volgorde van getallen van 0 tot 9 en we kennen het alfabet, zodat we kunnen anticiperen op de voortgang.


Door het base-36-nummer te gebruiken, kunnen er massaal grotere getallen worden gerefereerd met een economie van grootte. Terwijl een getal van twee cijfers u naar 99 brengt; ZZ, een tweecijferige Base-36-uitdrukking krijgt tot 1295. Z, ZZZ, ZZZ is het equivalent van de basis tien van 78.364.164.095. 

Met dat getal van zeven cijfers onder basis-36 kun je verwijzen naar elke levende persoon en bijna elke persoon die ooit leefde met zijn eigen unieke 7-cijferige nummer. 

Als je acht cijfers bereikt, kun je het internet der dingen hebben. Acht cijfers bij basis 36 tellen voor meer dan twee biljoen (2.821.109.907.455 om precies te zijn).

Base-36 is een goed praktisch plafond om mee te werken in plaats van basis tien of een hexadecimale reeks. PHP en MySQL hebben conversiefuncties die nummers van en naar basis 36 kunnen converteren. De functionaliteit is er. Het zorgt voor de opslag van meer compacte gegevens. 

Vanuit menselijk oogpunt is gezegd dat veel mensen zich een lijst van 5 dingen plus of min twee kunnen herinneren. Velen kunnen zich belangrijke telefoonnummers herinneren. En net zoals de meeste mensen een zevencijferig telefoonnummer kunnen oproepen, kan worden beargumenteerd dat ze een tekenreeksrepresentatie van zeven tekens van iets groots kunnen behouden - in plaats van een 1-in-een-miljoen telefoonnummer, een basis van zeven tekens-36 cijfer vertegenwoordigt een van 78 miljard referenties.   

Waarom zijn grote getallen belangrijk??

Zoals hierboven is aangegeven, kunnen grote getallen handig zijn om grote hoeveelheden gegevens te verwerken. Facebook slaat zijn berichten op met ID-nummers die omhoog draaien. 

Een post die ik net heb getrokken, heeft het ID-nummer van 902352183124757. Vijftien cijfers - 902 biljoen. Als ze 902 biljoen zijn, en een man zoals ik gooit een gekke hoeveelheid berichten per dag in en een tiental miljoenen doen hetzelfde als ik, die post-odometer zal binnenkort omvallen. 

Als de berichten waren geformatteerd als 10 base-36 cijfers, zou de database meer beenruimte hebben (bijv. Bijna 4 quadrillion (3,656,158,440,062,980) beschikbare referenties). Als Facebook tot dit punt is gekomen door exponentiële groei en die exponentiële groei nivelleert, dan moeten 2+ quadrillion posts die database de ruimte geven die het nodig heeft om naar nieuwe posts te verwijzen zonder naar een googolplex waarde te gaan.

Zijn basis-36-nummers niet intensief verwerkt??

Ja en nee. Binnen een database zijn gehele getallen de meest economische manier om gegevens op te slaan. Base-36-cijfers worden beschouwd als tekenreeksen en tekenreeksen zijn duurdere opslag. 

Op dezelfde manier verhoogt de automatische toename in MySQL alleen de gehele getallen. U kunt strings opmaken om consistent te zijn. Alle 10 tekens kunnen bijvoorbeeld worden gebruikt met nullen links van het getal, zodat 0000000008 acht zou zijn terwijl 00000000ZZ 1295 zou zijn. Bij alfabetisch sorteren zou de voortgang er als een numerieke voortgang uitzien. Terwijl auto-incrementering is ingebouwd in MySQL en de meeste andere relationele databases, is dit niet het enige spel in de stad. U kunt nieuwe automatisch gegenereerde base-36-nummers maken door een trigger aan een tabel te koppelen (die we kort zullen bespreken) om nieuwe, geordende waarden te introduceren wanneer nieuwe records worden ingevoegd.

Waar Base-36 kan worden gebruikt

Het doel van base-36 is verdichting en relevantie. In plaats van 10 cijfers om naar de mensen op aarde te verwijzen, zullen zeven karakters ze allemaal aanspreken. In plaats van 16 cijfers om alle statusupdates van Facebook ooit te beantwoorden, kunnen 10 tekens worden gebruikt. Als het om relevantie gaat, kan de reeks zowel een oplopende waarde zijn als een deel van de waarde kan worden gereserveerd om extra kwaliteiten aan te geven in wat wordt gedefinieerd.

Base-36 kan worden gebruikt om naar dit soort items te verwijzen:

  • Mensen. Een zevencijferig basis-36-nummer kan verwijzen naar 78 miljard mensen. Als u de referentie van een gebruiker converteert naar 7 tekens.
  • Landcodes. Landcodes zijn al twee tekenrepresentaties. Er zijn 193 erkende landen (door dat te schrijven, ik weet gewoon dat een land in tweeën zal opsplitsen tegen de tijd dat ik bij de close-bracket aanzie). De ISO-3166-norm is een lijst met tweecijferige landcodes. Met twee alfabetische tekens kunnen er naar 676 specifieke landen worden verwezen, bij landcodes kunt u slechts twee tekens gebruiken. Het gebruik van de ISO-3166-standaard laat meer dan 400 referenties ongebruikt, maar biedt nog steeds een algemene en herkenbare referentie.
  • Cities. China heeft met zijn 1 miljard inwoners meer dan 1020 steden. Naar die community's kan worden verwezen binnen twee basis-36 cijfers. Veel landen zullen minder dan 1000 gemeenschappen hebben. Laten we zeggen dat communityverwijzingen heel specifiek worden en om aan alle referenties te voldoen, kunnen drie cijfers 46.555 communities in een land associëren.
  • apparaten. Het internet der dingen komt eraan, dat weet ik zeker. Ik heb drie apparaten met hun eigen draadloze behoeften. Sommige technologievriendelijke mensen kunnen veel meer bekabelde apparaten hebben. Als dit 36 ​​apparaten per persoon waren, kon één cijfer al die apparaten afdekken. Twee cijfers om apparaten te verwijzen en dingen dekt 1295 mogelijkheden af.

Gefuseerde serienummers

Deze reeksen kunnen worden gecombineerd om uniek te worden door de tekens in een ordelijke volgorde te combineren. In het volgende voorbeeld kunt u een verwijzing naar mensen, hun locatie en hun apparaten maken. De hele reeks kan uniek zijn, terwijl elementen daarin worden herhaald.

Bijvoorbeeld: US001200GHK4 zou eigenlijk kunnen betekenen:

  • VS - landcode
  • 001 - Manhattan
  • 200GHK4 - De unieke code van een persoon.

Misschien worden hun apparaten toegevoegd aan het identificatieproces. Laten we zeggen dat de laptop hun primaire apparaat is. Wanneer hun mobiele telefoon in de computer wordt gezet, is dit het tweede apparaat dat aan de gebruiker is gekoppeld: US001200GHK42. De "2" staat voor dat tweede apparaat.

Als dat is hoe de base-36 werd gebruikt om identificatie te creëren, zal de lengte van de string spreken met wat hij associeert.

  • Twee cijfers lang = land met behulp van de ISO-3166-standaardcodes
  • Vijf cijfers lang = community in een land
  • Twaalf cijfers lang = een persoon zoals ze in een land wonen
  • Dertien cijfers lang = een verwijzing naar een IP-adresseerbaar apparaat dat eigendom is van een gebruiker in een bepaalde gemeenschap en een bepaald land.

Met 13 cijfers zal een MySQL-zoekopdracht voor "US%" voor alle Amerikaanse burgers retourneren. "US001%" zal alle mensen in Manhattan terugbrengen. "US001% 1" onthult het primaire / voorkeursapparaat dat door alle inwoners van Manhattan wordt gebruikt. Met een dergelijke logica kan communicatie worden gerouteerd naar een voorkeurshelft van een netwerk.

Natuurlijk zijn er veel van wat als:

  • Wat als ze van stad veranderen? De derde tot vijfde karakters veranderen.
  • Wat als ze naar een ander land springen? De eerste vijf cijfers veranderen om nieuwe opgravingen weer te geven.
  • Wat als ze meer dan 36 apparaten hebben? Als dat gebeurt, kunnen de laatste twee cijfers hun apparaat voorstellen in plaats van alleen de laatste - een ID van veertien cijfers zou zeggen: "deze kerel heeft veel gadgets."

Opslag in een database

Het hoofddoel van het maken van deze grote getallen en deze op te slaan als basis-36-referenties, is het oefenen van een soort economie. Deze moeten sequentieel zijn zoals indexsleutels, maar u hoeft hier geen specifieke wiskunde voor te doen.

In MySQL worden base-36-strings opgeslagen als VARCHAR gegevenstypen gedragen zich als gehele getallen. De strings kunnen worden vergeleken door middel van verzamelfuncties zoals MAX () en MIN () om de hoogste en laagste beschikbare nummers te krijgen, respectievelijk. 

Je kunt ook een base-36-string ophalen door in aflopende volgorde te sorteren om als eerste het hoogste getal te krijgen. In tegenstelling tot gehele getallen, kunnen basis-36-reeksen worden gefilterd met NET ZOALS Als de strings een combinatie zijn van samengevoegde reeksen en oplopende waarden.

Waarden gebruiken in MySQL

In MySQL is er de CONV () functie die kan converteren van alles van een base-2 tot een base-36-nummer. Om een ​​base-36 naar zijn basis 10 equivalent te krijgen, doe CONV ('ZA', 36, 10). Om het van een basis 10 naar een basis-36 te krijgen, kun je de andere kant op gaan. CONV ('1294', 10, 36). U kunt deze functies nesten om iets te maken dat het volgende verhoogt: CONV (CONV ('ZA', 36, 10) + 1, 10, 36)  zal 'ZB' uitvoeren.

Incrementerende Base-36-sleutels in MySQL

Dit kan in een aangepaste procedure worden geplaatst en die procedure kan worden geactiveerd wanneer nieuwe records in een databasetabel worden ingevoegd. In het onderstaande voorbeeld wordt de trigger toegevoegd aan de base_example tabel die moet worden uitgevoerd en maak een base-36-sleutel wanneer een nieuwe record wordt toegevoegd aan de tabel base_example.

CREËER TAFEL INDIEN NIET BESTAAT 'base_example' ('bkey' varchar (12) NOT NULL, 'info'-tekst NOT NULL) MOTOR = InnoDB DEFAULT CHARSET = latin1; CREATE TRIGGER 'b36_incr' VOOR INVOEGEN 'base_example' VOOR ELKE RIJ BEGIN DECLARE old_bkey VARCHAR (12); DECLARE rowcount INT; SELECTEER COUNT (*), btoets in rowcount, old_bkey FROM 'base_voorbeeld' GROUP BY btoets ORDER BY btoets DESC LIMIT 1; ALS (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

Figuur 1. Een getriggerde procedure om waarde te creëren en te verhogen.

In dit voorbeeld zijn er twee aannames toegevoegd aan de mix. Eerst de VARCHAR veld moet 12 tekens lang zijn. Ten tweede, de waarden in de VARCHAR velden zijn links gevuld met nullen zodat alle uitvoer er consistent uitziet en op een voorspelbare manier kan worden gesorteerd.

Wiskunde met basis-36

Base-36 is cool, maar de meeste talen verwijzen nog steeds naar dingen in base 10 en binary. PHP kan echter basisconversies uitvoeren en het is slim genoeg om de letters A tot en met Z te extrapoleren naar de 11e tot en met 36e cijfers. 

Met een eenvoudige functie kunnen basis-36-cijfers een functie worden doorgegeven (die we zo dadelijk zullen zien) voor conversie, berekening en een retourwaarde. Dit doet het door de 0-9A-Z karakters uit de formule te trekken, een base-36 berekening uit te voeren en de output vervolgens terug naar base-36 te converteren.

$ bthreesix = "ZZ"; // het basis 10 equivalent van 1295 $ zz = base_convert ($ bthreesix, 36,10); $ Zz ++; // ZZ wordt 100 $ bthreesix = base_convert ($ zz, 10,36); echo $ bthreesix;

Formules van Base-36 doen in PHP

Er is een limiet aan hoe ingewikkeld de wiskunde is, maar ik heb een voorbeeldfunctie geschreven b36math () die een base-36-formule converteert naar een base-36-resultaat.

"; print b36math (" ZW + 9 "); print"
"; functie b36math ($ formula =" ") $ out = preg_replace_callback (" / ([\ w] +) / "," b36convert ", $ formula); // incr / decr werken niet zoals geadverteerd $ out = str_replace ("++", "+ 1", $ out); $ out = str_replace ("-", "- 1", $ out); eval ('$ outer ='. $ out. ';' ); return strtoupper (base_convert ($ outer, 10, 36)); functie b36convert ($ overeenkomsten) $ digits = ""; array_shift ($ overeenkomsten); foreach ($ overeenkomsten als $ sleutel => $ overeenkomst) $ cijfers. = $ match; $ new_number = base_convert ($ digits, 36, 10); return intval ($ nieuw_nummer);?>

Figuur 2. De b36math-conversiefunctie om functies uit te voeren die zijn uitgevoerd met base-36-nummers.

Conclusie

Onze wereld is data hongerig. Die gegevens moeten goed worden geraadpleegd. In de crunch om toegang te krijgen tot grotere hoeveelheden gegevens, is het gebruik van referenties die zijn opgeslagen als basis-36-nummers een manier om grotere aantallen op te slaan in minder ruimte. 

Er is een voetspoor naar wat een waardevol goed is: verwerkingssnelheid, bandbreedte of opslag. Wanneer iemand een overvloedige voorraad heeft, kun je het besteden aan het compenseren voor de ander. Als u veel beschikbare cycli voor verwerking hebt, kunt u opslaggegevens in een omslachtig formaat doen en verwerking gebruiken om het bruikbaar te maken. 

Hoewel er een limiet is van het aantal cijfers waarnaar in een geheel getal kan worden verwezen, varchar velden kunnen 255 tekens bevatten en tekstvelden hebben een open einde. Zeer grote basis-36-nummers kunnen worden opgeslagen om te verwijzen naar individuele elementen in zeer grote hoeveelheden gegevens.