Comprensione del Math Base-36

Il mio nome è lungo 13 caratteri. Ci sono molti DeWolfes, molti Shawns, alcuni Shawn DeWolfes. Il mio nome di 13 caratteri non significa nulla di unico. Anche il mio numero di assicurazione sociale a nove cifre va solo lontano. Nel mio paese, il Canada, mi definisce specificamente, ma qualsiasi altra nazione con un sistema di numeri di assicurazione sociale a nove cifre avrà probabilmente un membro con un numero uguale al mio.

Che cosa succede se un numero potrebbe indirizzare ogni persona viva, essere più breve di un nome e più breve di un numero di assicurazione sociale? Non puoi farlo con i numeri Base-10, ma con Base-36, è un gioco da ragazzi.

Usiamo la base dieci così tanto da non considerare l'utilità di salire di 10 ordini con ogni cifra che aggiungiamo a un numero. Con due cifre possiamo andare da 0 a 99. Esadecimale lo prende ulteriormente: con due cifre esadecimali, possiamo arrivare a 255 - da 0 a FF. 

I numeri esadecimali superano il segno di dieci cifre senza dover inventare nuovi numeri. Lo fa usando A, B, C, D, E e F per fare riferimento all'11 ° al 16 ° digitale. Base-36 fa un passo in più e usa tutti i personaggi convenzionalmente disponibili che ci sono familiari. Base-36 utilizza i numeri per gestire le prime dieci cifre. Le cifre da 11 a 36 sono referenziate con l'alfabeto dalla A alla Z. Conosciamo l'ordine dei numeri da 0 a 9 e conosciamo l'alfabeto, quindi possiamo anticipare la progressione.


Usando il numero di base-36, è possibile fare riferimento a numeri molto più grandi con un'economia di dimensioni. Mentre un numero a due cifre ti porta a 99; ZZ, un'espressione Base-36 a due cifre arriva a 1295. Z, ZZZ, ZZZ è l'equivalente base di 78,364,164,095. 

Con quel numero di sette cifre sotto la base-36, puoi fare riferimento a ogni persona viva e quasi a ogni persona che sia mai esistita con il proprio numero univoco a 7 cifre. 

Quando arrivi a otto cifre, potresti avere l'Internet delle cose coperte. Otto cifre alla base-36 conta fino a oltre due trilioni (2.821.109.907.455 per l'esattezza).

Base-36 è un buon limite pratico per lavorare al posto di base dieci o sequenze esadecimali. PHP e MySQL hanno funzioni di conversione in grado di convertire numeri da e verso la base-36. La funzionalità è lì. Permette la memorizzazione di dati più compatti. 

Dal punto di vista umano, è stato detto che molte persone possono ricordare una lista di 5 cose più o meno due. Molti possono ricordare numeri telefonici importanti. E proprio come la maggior parte delle persone può ricordare un numero di telefono di sette cifre, quindi si può sostenere che possono mantenere una rappresentazione in sette caratteri di qualcosa di grande - invece di un numero di telefono di 1 su un milione, una base di sette caratteri-36 la figura rappresenterà uno dei 78 miliardi di riferimenti.   

Perché i grandi numeri sono importanti?

Come mostrato sopra, i numeri grandi possono essere utili per affrontare grandi quantità di dati. Facebook memorizza i loro post con i numeri ID che salgono a spirale verso l'alto. 

Un post che ho appena estratto ha il numero ID di 902352183124757. Quindici cifre: 902 trilioni. Se sono a 902 trilioni, e un ragazzo come me getta in una quantità pazzesca di messaggi al giorno e decine di milioni fanno come faccio io, quell'odometro del post si sta per rovesciare presto. 

Se i post erano formattati in 10 cifre di 36 basi, il database avrebbe più spazio per le gambe (ad esempio, quasi 4 quadrilioni di riferimenti (3.656.158.440.062.980) disponibili). Se Facebook è arrivato a questo punto attraverso una crescita esponenziale e la crescita esponenziale sta livellando, allora 2+ quadrilioni di post dovrebbero dare a quel database la stanza di cui ha bisogno per fare riferimento ai nuovi post senza andare a un valore googolplex.

I numeri Base-36 non sono elaborati intensamente?

Sì e no. All'interno di un database, gli interi rappresentano il modo più economico per archiviare i dati. I numeri Base-36 sarebbero considerati stringhe e le stringhe sono più costose. 

Allo stesso modo, l'auto-incremento in MySQL incrementerà solo gli interi. È possibile formattare le stringhe per essere coerenti. Ad esempio, tutti i 10 caratteri potrebbero essere utilizzati con zero alla sinistra del numero in modo che 0000000008 sarebbe otto mentre 00000000ZZ sarebbe 1295. Se ordinati alfabeticamente, la progressione sembrerebbe una progressione numerica. Mentre l'auto-incremento è incorporato in MySQL e nella maggior parte dei database relazionali, non è l'unico gioco in città. Puoi creare nuovi numeri base-36 generati automaticamente associando un trigger a una tabella (che discuteremo momentaneamente) per introdurre nuovi valori ordinati quando vengono inseriti nuovi record.

Dove può essere usata la Base-36

L'obiettivo della base-36 è la compattazione e la pertinenza. Invece di 10 cifre per fare riferimento alle persone sulla Terra, sette personaggi li indirizzeranno tutti. Invece di 16 cifre per indirizzare tutti gli aggiornamenti di stato di Facebook, è possibile utilizzare 10 caratteri. Quando si tratta di rilevanza, la sequenza può essere sia un valore incrementale che parte del valore può essere accantonata per dichiarare qualità aggiuntive in ciò che viene definito.

Base-36 può essere utilizzato per fare riferimento a questo tipo di elementi:

  • Persone. Un numero di base-36 a sette cifre può fare riferimento a 78 miliardi di persone. Se si converte il riferimento di un utente in 7 caratteri.
  • Codici paese. I codici Paese sono già due rappresentazioni di caratteri. Ci sono 193 paesi riconosciuti (scrivendo questo, so solo che un po 'di paese si dividerà in due quando raggiungerò la parentesi chiusa). Lo standard ISO-3166 è un elenco di codici Paese a due cifre. Con due caratteri alfabetici, è possibile fare riferimento a 676 paesi specifici, mentre i codici paese sono validi per l'utilizzo di soli due caratteri. L'uso dello standard ISO-3166 lascia oltre 400 riferimenti inutilizzati, ma fornisce comunque un riferimento comune e riconoscibile.
  • Città. La Cina, con il suo miliardo di persone, ha oltre 1020 città. Queste comunità potrebbero essere referenziate all'interno di due cifre base-36. Molti paesi avranno meno di 1000 comunità. Diciamo che i riferimenti alle comunità diventano davvero particolari e per soddisfare tutti i riferimenti, tre cifre possono associare 46.655 comunità all'interno di un paese.
  • dispositivi. L'Internet of Things sta arrivando, ne sono sicuro. Ho tre dispositivi con le proprie esigenze wireless. Alcune persone che amano la tecnologia potrebbero avere molti altri dispositivi cablati. Se questo fosse di 36 dispositivi per persona, allora una cifra potrebbe coprire tutti quei dispositivi. Due cifre per fare riferimento ai dispositivi e le cose coprono 1295 possibilità.

Numeri seriali amalgamati

Queste stringhe possono essere combinate per rendere unici amalgamando i personaggi in una sequenza ordinata. Nell'esempio seguente, puoi fare riferimento alle persone, alla loro posizione e ai loro dispositivi. L'intera stringa può essere unica mentre gli elementi si ripetono.

Ad esempio: US001200GHK4 potrebbe effettivamente significare:

  • Stati Uniti - codice del paese
  • 001 - Manhattan
  • 200GHK4 - Il codice univoco di una persona.

Forse i loro dispositivi vengono aggiunti al processo di identificazione. Supponiamo che il laptop sia il loro dispositivo principale. Quando il loro cellulare viene inserito nel disegno, è il secondo dispositivo associato all'utente: US001200GHK42. Il "2" sta per quel secondo dispositivo.

Se questo è il modo in cui la base-36 è stata lavorata per creare un'identificazione, la lunghezza della stringa parlerà a ciò che associa.

  • Due cifre lunghe = paese che utilizza i codici standard ISO-3166
  • Cinque cifre lunghe = comunità in un paese
  • Dodici cifre lunghe = una persona che risiede in un paese
  • Tredici cifre lunghe = un riferimento a un dispositivo IP indirizzabile di proprietà di un utente in una particolare comunità e paese.

Con 13 cifre, una ricerca MySQL per "% USA" restituirà tutti i cittadini statunitensi. "US001%" restituirà tutte le persone a Manhattan. "US001% 1" rivelerà il dispositivo principale / preferito utilizzato da tutti quei residenti di Manhattan. Con una logica del genere, la comunicazione può essere indirizzata a un blocco preferito di una rete.

Certo, ci sono un sacco di cosa se:

  • Cosa succede se cambiano città? Il terzo e il quinto carattere cambiano.
  • Cosa succede se saltano in un altro paese? Le prime cinque cifre cambiano per riflettere nuovi scavi.
  • Cosa succede se possiedono più di 36 dispositivi? Se ciò accade, le ultime due cifre possono rappresentare il loro dispositivo anziché solo l'ultimo: un ID di quattordici cifre dice "questo tizio ha un sacco di gadget".

Archiviazione in un database

Lo scopo principale di creare questi grandi numeri e archiviarli come riferimenti di base-36 è praticare una sorta di economia. Questi devono essere sequenziali come le chiavi dell'indice, ma non devi fare particolari calcoli matematici con loro.

In MySQL, stringhe base-36 memorizzate come VARCHAR i tipi di dati si comportano come numeri interi. Le stringhe possono essere confrontate tramite funzioni aggregate come MAX () e MIN () per ottenere i numeri più alti e più bassi, rispettivamente. 

Puoi anche recuperare una stringa base 36 ordinando in ordine decrescente per ottenere il numero più alto per primo. A differenza degli interi, le stringhe di base-36 possono essere filtrate con PIACE le dichiarazioni dovrebbero essere le stringhe una combinazione di serie amalgamate e valori incrementali.

Utilizzo dei valori in MySQL

In MySQL c'è il CONV () funzione che può convertire da qualsiasi cosa, da un numero base-2 ad un numero base-36. Per ottenere una base-36 alla sua base 10 equivalente, fare CONV ('ZA', 36, 10). Per ottenerlo da una base 10 a una base-36 puoi andare dall'altra parte. CONV ('1294', 10, 36). È possibile nidificare queste funzioni per creare qualcosa che incrementi: CONV (CONV ('ZA', 36, 10) + 1, 10, 36)  uscirà 'ZB.'

Incremento delle chiavi Base-36 in MySQL

Questo può essere inserito in una procedura personalizzata e tale procedura può essere attivata quando nuovi record vengono inseriti in una tabella di database. Nell'esempio seguente, il trigger viene aggiunto al base_example tabella per eseguire e creare una chiave base-36 quando un nuovo record viene aggiunto alla tabella base_esempio.

CREATE TABLE SE NON ESISTE 'base_esempio' ('bkey' varchar (12) NOT NULL, testo 'info' NOT NULL) ENGINE = InnoDB DEFAULT CHARSET = latin1; CREATE TRIGGER 'b36_incr' PRIMA DI INSERIRE 'base_example' PER OGNI FILA INIZIA A DECLARE old_bkey VARCHAR (12); DICHIARARE il conteggio delle righe INT; SELECT COUNT (*), bkey in rowcount, old_bkey FROM 'base_example' GROUP BY bkey ORDER 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

Figura 1. Una procedura attivata per creare e incrementare il valore.

In questo esempio, ci sono due ipotesi aggiunte al mix. Prima il VARCHAR il campo deve avere una lunghezza di 12 caratteri. Secondo, i valori nel VARCHAR i campi vengono riempiti con degli zeri a sinistra in modo che tutto l'output sia coerente e possa essere ordinato in modo prevedibile.

Matematica con Base-36

Base-36 è bello, ma la maggior parte delle lingue fa ancora riferimento a cose in base 10 e binari. PHP può comunque eseguire conversioni di base ed è abbastanza intelligente da estrapolare le lettere dalla A alla Z che coprono dall'11 ° alla 36 ° cifra. 

Con una semplice funzione, i numeri base-36 possono essere passati a una funzione (che vedremo momentaneamente) per la conversione, il calcolo e un valore di ritorno. Lo fa tirando i caratteri 0-9A-Z dalla formula, eseguendo un calcolo di base-36 e quindi riconvertendo l'output in base-36.

$ bthreesix = "ZZ"; // l'equivalente di base di 1295 $ zz = base_convert ($ bthreesix, 36,10); $ Zz ++; // ZZ diventa 100 $ bthreesix = base_convert ($ zz, 10,36); echo $ bthreesix;

Fare formule Base-36 in PHP

C'è un limite a quanto sia complessa la matematica, ma ho scritto una funzione di esempio b36math () che converte una formula base 36 in un risultato base-36.

"; stampa b36math (" ZW + 9 "); stampa"
"; function b36math ($ formula =" ") $ out = preg_replace_callback (" / ([\ w] +) / "," b36convert ", $ formula); // incr / decr non funziona come $ pubblicizzato = str_replace ("++", "+ 1", $ out); $ out = str_replace ("-", "- 1", $ out); eval ('$ outer ='. $ out. ';' restituisce strtoupper (base_convert ($ outer, 10, 36)); function b36convert ($ corrisponde) $ digit = ""; array_shift ($ corrisponde); foreach ($ corrisponde a $ key => $ corrisponde) $ cifre. = $ match; $ new_number = base_convert ($ digit, 36, 10); return intval ($ new_number);?>

Figura 2. La funzione di conversione b36math per eseguire funzioni eseguite con numeri base-36.

Conclusione

Il nostro mondo è affamato di dati. Questi dati devono essere ben referenziati. Nel crunch per accedere a corpi di dati più grandi, l'uso di riferimenti memorizzati come numeri di base-36 è un modo per memorizzare numeri più grandi in meno spazio. 

C'è una corsa ai piedi per quello che è un bene prezioso: velocità di elaborazione, larghezza di banda o spazio di archiviazione. Quando si è generosi, si può spendere per compensare l'altro. Se disponi di molti cicli disponibili per l'elaborazione, puoi archiviare i dati in un formato ingombrante e utilizzare l'elaborazione per renderla utilizzabile. 

Mentre c'è un limite di quante cifre possono essere referenziate in un numero intero, varchar i campi possono arrivare a 255 caratteri e i campi di testo sono aperti. Numeri di base 36 molto grandi possono essere memorizzati per fare riferimento a singoli elementi in corpi di dati molto grandi.