[PYTHON] Brouiller de manière réversible un entier de n'importe quel nombre de chiffres

Que veux-tu faire

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.

point important

Si le nombre est 48 bits, salt et inverse_salt doivent également être 48 bits.

Recommended Posts

Brouiller de manière réversible un entier de n'importe quel nombre de chiffres
Obtenez le nombre de chiffres
Brouillage réversible d'entiers en Python
Sortie csv avec un nombre différent de chiffres pour chaque colonne avec numpy
Développez n'importe quel nombre d'arguments avec yasnippet
Comment obtenir le nombre de chiffres en Python