Je voulais convertir de manière réversible une valeur numérique avec un nombre arbitraire de chiffres, et lorsque j'ai cherché diversement, j'ai trouvé les articles suivants de grands ancêtres. Brouillage réversible des nombres entiers --C vous aiguisé Brouillage réversible d'entiers en Python
Modifié pour que le nombre de chiffres puisse être reçu comme argument. Il semble que la partie inverse de bits ne peut être bien réalisée que si elle est un multiplicateur de 2. (Peut-être que je n'ai pas assez découvert) La partie inverse était un peu découpée.
scramble.py
# -*- coding: utf-8 -*-
"""
Création d'entiers réversibles sans chiffres
"""
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)
Quand vous l'utilisez réellement
from scramble import scramble
print scramble(1, 48, 0x717b9f2dded3, 0xb784b8b6295b)
>> 186674888497786L
print scramble(186674888497786L, 48, 0x717b9f2dded3, 0xb784b8b6295b
>> 1
De cette manière, il a été converti de manière réversible.
Si le nombre est 48 bits, salt et inverse_salt doivent également être 48 bits.
Recommended Posts