Wie würden Sie eine Ganzzahl in die Basis 62 konvertieren (wie hexadezimal, jedoch mit den folgenden Ziffern: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ').
Ich habe versucht, eine gute Python-Bibliothek dafür zu finden, aber alle scheinen mit dem Konvertieren von Zeichenfolgen beschäftigt zu sein. Das Python base64-Modul akzeptiert nur Zeichenfolgen und wandelt eine einzelne Ziffer in vier Zeichen um. Ich suchte nach etwas ähnlichem, was URL-Shortener verwenden.
Antworten:
Es gibt kein Standardmodul dafür, aber ich habe meine eigenen Funktionen geschrieben, um dies zu erreichen.
Beachten Sie die Tatsache, dass Sie ihm jedes Alphabet zum Codieren und Decodieren geben können. Wenn Sie das
alphabet
Argument weglassen, erhalten Sie das in der ersten Codezeile definierte 62-Zeichen-Alphabet und damit die Codierung / Decodierung zur / von der 62-Basis.Hoffe das hilft.
PS - Bei URL-Kürzern habe ich festgestellt, dass es besser ist, einige verwirrende Zeichen wie 0Ol1oI usw. wegzulassen. Daher verwende ich dieses Alphabet für meine URL-Kürzungsanforderungen.
"23456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
Habe Spaß.
quelle
$-_.+!*'(),;/?:@&=
Sie können wahrscheinlich auch andere Charaktere wie[]~
usw. verwenden.Ich habe auch einmal ein Skript dafür geschrieben, ich finde es ziemlich elegant :)
Anwendungsbeispiel:
quelle
reversed(string)
schneller als das Schneidenstring[::-1]
in der Funktion base_decode verwenden.integer /= length
,integer //=length
um den richtigen Rest zu bekommenDer folgende Decoder-Hersteller arbeitet mit jeder vernünftigen Basis, hat eine viel aufgeräumtere Schleife und gibt eine explizite Fehlermeldung aus, wenn er auf ein ungültiges Zeichen trifft.
quelle
**
Operator in der Schleife.Wenn Sie nach der höchsten Effizienz suchen (wie Django), möchten Sie Folgendes. Dieser Code ist eine Kombination effizienter Methoden von Baishampayan Ghose und WoLpH sowie John Machin.
Möglicherweise möchten Sie Ihr Wörterbuch auch im Voraus berechnen. (Hinweis: Die Codierung mit einer Zeichenfolge ist selbst bei sehr langen Zahlen effizienter als mit einer Liste.)
1 Million Nummern in weniger als 2,5 Sekunden codiert und decodiert. (2,2 GHz i7-2670QM)
quelle
tuple()
umBASE_ALPH
am Anfang. In Python ist jeder String iterierbar. Diese Funktion wird natürlich von ausgenutztenumerate()
. So wird der Code noch schlanker :)Wenn Sie das django-Framework verwenden, können Sie das Modul django.utils.baseconv verwenden.
Neben base62 definierte baseconv auch base2 / base16 / base36 / base56 / base64.
quelle
Sie möchten wahrscheinlich base64, nicht base62. Es gibt eine URL-kompatible Version davon, sodass die zusätzlichen zwei Füllzeichen kein Problem darstellen sollten.
Der Prozess ist ziemlich einfach; Beachten Sie, dass base64 6 Bits und ein reguläres Byte 8 darstellt. Weisen Sie jedem der 64 ausgewählten Zeichen einen Wert von 000000 bis 111111 zu und setzen Sie die 4 Werte so zusammen, dass sie mit einem Satz von 3 base256-Bytes übereinstimmen. Wiederholen Sie diesen Vorgang für jeden Satz von 3 Bytes und füllen Sie ihn am Ende mit dem von Ihnen gewählten Auffüllzeichen auf (0 ist im Allgemeinen nützlich).
quelle
Wenn Sie lediglich eine kurze ID generieren müssen (da Sie URL-Kürzungen erwähnen), anstatt etwas zu codieren / decodieren, kann dieses Modul helfen:
https://github.com/stochastic-technologies/shortuuid/
quelle
Sie können das zbase62-Modul von pypi herunterladen
z.B
quelle
Ich habe stark von den Beiträgen anderer hier profitiert. Ich brauchte den Python-Code ursprünglich für ein Django-Projekt, aber seitdem habe ich mich an node.js gewandt. Hier ist eine Javascript-Version des Codes (des Codierungsteils), den Baishampayan Ghose bereitgestellt hat.
quelle
Ich hoffe das folgende Snippet konnte helfen.
Verwendung für Ihren Fall:
Natürlich können Sie ein anderes Alphabet angeben, das aus einer geringeren oder größeren Anzahl von Symbolen besteht. Anschließend wird Ihre Zahl in die kleinere oder größere Zahlenbasis konvertiert. Wenn Sie beispielsweise '01' als Alphabet angeben, wird eine Zeichenfolge ausgegeben, die die Eingabenummer als Binär darstellt.
Sie können das Alphabet zunächst mischen, um eine eindeutige Darstellung der Zahlen zu erhalten. Dies kann hilfreich sein, wenn Sie einen URL-Shortener-Dienst durchführen.
quelle
if num < 0 or type(num) not in (int, long):
.long
es in Py 3.x nicht existiert - daher sollte man diese Antwort verwenden .isinstance(x, (type(1), type(2**32)))
.Dafür gibt es jetzt eine Python-Bibliothek.
Ich arbeite daran, ein Pip-Paket dafür zu erstellen.
Ich empfehle Ihnen, meine base.py https://github.com/kamijoutouma/bases.py zu verwenden, die von base.js inspiriert wurde
Informationen zu den verwendbaren Basen finden Sie unter https://github.com/kamijoutouma/bases.py#known-basesalphabets
quelle
Hier ist meine Lösung:
Erläuterung
In jeder Basis ist jede Zahl gleich.
a1+a2*base**2+a3*base**3...
Das Ziel ist es also, allea
s zu finden .Für jeden
N=1,2,3...
isoliert der Code dasaN*base**N
durch "Moduloing",b
fürb=base**(N+1)
das alle Slicesa
größer als sindN
, und das Slicing allera
s so, dass ihre Serien kleiner sind alsN
durcha
jedes Mal, wenn die Funktion vom Strom rekursiv aufgerufen wirdaN*base**N
.Base%(base-1)==1
daherbase**p%(base-1)==1
und daherq*base^p%(base-1)==q
mit nur einer Ausnahme, wannq==base-1
welche zurückkehrt0
. Um diesen Fall zu beheben, wird es zurückgegeben0
. Die Funktion prüft0
von Anfang an.Vorteile
In diesem Beispiel gibt es nur eine Multiplikation (anstelle einer Division) und einige Moduloperationen, die alle relativ schnell sind.
quelle
Persönlich mag ich die Lösung von Baishampayan, hauptsächlich weil ich die verwirrenden Charaktere entfernt habe.
Der Vollständigkeit halber und einer Lösung mit besserer Leistung zeigt dieser Beitrag eine Möglichkeit, das Python base64-Modul zu verwenden.
quelle
Ich habe das vor einiger Zeit geschrieben und es hat ziemlich gut funktioniert (Negative und alles inklusive)
Entschuldigung für die Länge des Ganzen
quelle
quelle
Hier ist eine rekursive und iterative Methode, um dies zu tun. Die iterative ist je nach Ausführungszahl etwas schneller.
quelle
Python
3.7.x
Ich habe einen PhD-Github für einige Algorithmen gefunden, als ich nach einem vorhandenen base62-Skript gesucht habe . Es funktionierte zu diesem Zeitpunkt nicht für die aktuelle Max-Version von Python 3, also habe ich das Problem behoben und ein wenig umgestaltet. Ich arbeite normalerweise nicht mit Python und habe es immer ad-hoc verwendet, also YMMV. Alle Kredite gehen an Dr. Zhihua Lai . Ich habe gerade die Probleme für diese Version von Python gelöst.
Datei
base62.py
Datei
try_base62.py
Ausgabe von
try_base62.py
Da das Repo keine Lizenzinformationen enthielt, habe ich eine PR eingereicht, damit der ursprüngliche Autor zumindest weiß, dass andere Personen ihren Code verwenden und ändern.
quelle
Entschuldigung, ich kann Ihnen hier nicht mit einer Bibliothek helfen. Ich würde es vorziehen, base64 zu verwenden und Ihrer Wahl nur zusätzliche Zeichen hinzuzufügen - wenn möglich!
Dann können Sie das base64-Modul verwenden.
Wenn das wirklich, wirklich nicht möglich ist:
Sie können es selbst so machen (dies ist Pseudocode):
quelle
mit einfacher Rekursion
quelle
Am einfachsten überhaupt.
quelle