3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

任意の桁数の整数を可逆スクランブルする

Last updated at Posted at 2015-05-20

やりたい事

任意の桁数の数値を可逆変換したいと思い、いろいろ検索すると以下の偉大な先人様方の記事を見つけた。
整数を可逆スクランブルする - C Sharpens you up
Python で整数を可逆スクランブルする

桁数部分を引数で受け取れるように変更した。
ビットリバース部分は2の乗数でないとうまく実現できなさそう。(調べが足りなかったかもしれない)
リバース部分はちょっと手を抜いた。

scramble.py
# -*- coding: utf-8 -*-
"""
桁数フリーな可逆整数作成
"""

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)

実際に使ってみると

from scramble import scramble

print scramble(1, 48, 0x717b9f2dded3, 0xb784b8b6295b)
>> 186674888497786L

print scramble(186674888497786L, 48, 0x717b9f2dded3, 0xb784b8b6295b
>> 1

このようにちゃんと可逆変換された。

注意点

numberが48bitの場合、salt, inverse_saltも48bitを法とする事。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?