Frage

Wenn Sie eine UUID in Python zu schaffen, likeso:

>>> uuid.uuid1()
UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')

Wie könnte man Karte, die UUID in einen String des aktivierten Alphabet AZ aus minus Zeichen D, F, I, O, Q und U sowie die Ziffern sowie die Zeichen „+“ und „=“ . das heißt, die von einer ganzen Zahl oder Zeichenkette auf den Satz von 32 (relativ OCR friendly) Zeichen:

[ABCEGHJKLMNPRSTVWXYZ1234567890+=]

Ich werde nennen dies die OCRf Set (für OCR-freundlich).

Ich möchte eine isomorph Funktion haben:

def uuid_to_ocr_friendly_chars(uid)
    """takes uid, an integer, and transposes it into a string made 
       of the the OCRf set
    """
    ...

Mein erster Gedanke ist durch den Prozess gehen von der UUID Basis zu ändern 32. z.

OCRf = "ABCEGHJKLMNPRSTVWXYZ1234567890+="

def uuid_to_ocr_friendly_chars(uid):
     ocfstr = ''
     while uid > 1:
        ocfstr += OCRf[uid % 32]
        uid /= 32
     return ocfstr

Allerdings würde Ich mag wissen, ob diese Methode die beste und schnellste Weg, um diese Umwandlung zu gehen - oder ob es eine einfachere und schnellere Verfahren (zB ein builtin, ein intelligenter Algorithmus, oder einfach nur eine bessere Methode).

Ich bin für Ihre Eingabe dankbar. Danke.

War es hilfreich?

Lösung

Wie wichtig ist es Ihnen zu „quetschen“ die Darstellung von 18,75%, das heißt 32 bis 26 Zeichen? Denn wenn dieser kleinen Prozentsatz der Bytes Einsparung ist nicht unbedingt entscheidend, wird so etwas wie uid.hex.upper().replace('D','Z') tun, was Sie fragen (nicht mit dem ganzen Alphabet Sie zur Verfügung stellen, aber die einzig Kosten dafür fehlen, dass 18,75% „Quetschen“).

Wenn jeder letzten Byte nach unten drückst entscheidend ist, würde ich auf Teil von 20 Bit arbeitet je - das 5 Hex-Zeichen ist, 4 Zeichen in Ihrem flippigen Alphabet. Es gibt 6 davon (plus 8 Bits übrig, für die Sie die hex.upper().replace nehmen können, wie oben, da es nichts etwas zu tun schicker zu gewinnen ist). Sie können ganz einfach die Substrings durch Aufschneiden .hex und biegen jeweils in einen int mit einem int(theslice, 16). Dann können Sie im Grunde den gleichen Algorithmus anwenden Sie oben verwenden - aber die Arithmetik ist alles getan, was auf vielen kleineren Zahlen, so sollte die Geschwindigkeitsverstärkung Material sein. Auch nicht die Zeichenfolge erstellen, indem Sie auf += Looping - machen Sie eine Liste aller „Ziffern“, und ''.join sie alle am Ende -., Die auch eine Leistungssteigerung ist

Andere Tipps

>>> OCRf = 'ABCEGHJKLMNPRSTVWXYZ1234567890+='
>>> uuid = 'a8098c1a-f86e-11da-bd1a-00112444be1e'
>>> binstr = bin(int(uuid.replace("-",""),16))[2:].zfill(130)
>>> ocfstr = "".join(OCRf[int(binstr[i:i+5],2)] for i in range(0,130,5))
>>> ocfstr
'HLBJJB2+ETCKSP7JWACGYGMVW+'

So konvertieren wieder zurück

>>> "%x"%(int("".join(bin(OCRf.index(i))[2:].zfill(5) for i in ocfstr),2))
'a8098c1af86e11dabd1a00112444be1e'
transtbl = string.maketrans(
  'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',
  'ABCEGHJKLMNPRSTVWXYZ1234567890+='
)

uuidstr = uuid.uuid1()

print base64.b32encode(str(uuidstr).replace('-', '').decode('hex')).rstrip('=').translate(transtbl)

Ja, diese Methode hat macht mir ein bisschen krank, danke für die Nachfrage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top