Ich wollte einen numerischen Wert mit einer beliebigen Anzahl von Ziffern reversibel konvertieren, und als ich auf verschiedene Weise suchte, fand ich die folgenden Artikel großer Vorfahren. Reversibles Verwürfeln von ganzen Zahlen - C schärft Sie Reversibles Verwürfeln von Ganzzahlen in Python
Geändert, damit die Anzahl der Ziffern als Argument empfangen werden kann. Es scheint, dass der Bitumkehrteil nur dann gut realisiert werden kann, wenn es sich um einen Multiplikator von 2 handelt. (Vielleicht habe ich nicht genug herausgefunden) Der hintere Teil war etwas ausgeschnitten.
scramble.py
# -*- coding: utf-8 -*-
"""
Ziffernfreie reversible Ganzzahlerstellung
"""
class Scramble:
def __init__(self, bit_digit):
self.__bit_digit = bit_digit
self.__mask = (1 << bit_digit) - 1
def scramble(self, number, salt, inverse_salt):
return self.__trim(self.__reverse(self.__trim(number * salt)) * inverse_salt)
def __reverse(self, number):
bit = '0' * self.__bit_digit + bin(number)[2:]
bit = bit[-self.__bit_digit:]
bit = ''.join(reversed(list(bit)))
return long(bit, 2)
def __trim(self, number):
return number & self.__mask
def scramble(number, bit_digit, salt, inverse_salt):
return Scramble(bit_digit).scramble(number, salt, inverse_salt)
Wenn Sie es tatsächlich benutzen
from scramble import scramble
print scramble(1, 48, 0x717b9f2dded3, 0xb784b8b6295b)
>> 186674888497786L
print scramble(186674888497786L, 48, 0x717b9f2dded3, 0xb784b8b6295b
>> 1
Auf diese Weise wurde es reversibel konvertiert.
Wenn die Zahl 48 Bit ist, sollten Salt und inverse_salt ebenfalls 48 Bit sein.
Recommended Posts