LoginSignup
0
0

More than 1 year has passed since last update.

Pythonでランダム文字列を数値化する

Last updated at Posted at 2021-12-30

背景・目的

  • とある作業で、文字列を数値化する必要があったので作業ログとして残します。
  • IDのように英字が含まれる文字列に対して、分散化したいため、一度数値に変換してして余りを求めたいと考えました。

結論

  • 一度バイト配列に変換してから、int型に直す。

内容

文字列をバイト配列に変換

  • コード
string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890@`:*/?"
print("byte[] {0}".format(string.encode('utf-8')))
  • 結果
byte[] b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890@`:*/?'

バイト配列から数値に変換

  • コード
    • int.from_bytesを利用する。
    • パラメータには、バイト配列と、byteorderを渡す。
      • byteorderの説明は以下の通り。

byteorder 引数は、整数を表すのに使われるバイトオーダーを決定します。 byteorder が "big" なら、最上位のバイトがバイト配列の最初に来ます。 byteorder が "little" なら、最上位のバイトがバイト配列の最後に来ます。ホストシステムにネイティブのバイトオーダーを要求するには、 sys.byteorder をバイトオーダーの値として使ってください。

  • bigとlittleが指定可能らしい。
    • これらはエンディアンの指定で、ビッグエンディアンは、左から大きい値(8桁なら128、64、32・・・1のように)。リトルエンディアンは、左から小さい値(8桁なら、1、2、4・・・128)となるようだ。
string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890@`:*/?"
print("numeric {0}".format(int.from_bytes(string.encode('utf-8'), byteorder='big')))
  • 結果
numeric 3758001799418605191197857118323574174346338316370081010955161214851720350686724878846949519162920740126535318039925868075538283434967887497638995678921760193831907135

コード全体

import os
import sys

LIST =["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890@`:*/?"]


def generate_string2numberic(string):
    print("byte[] {0}".format(string.encode('utf-8')))
    print("numeric {0}".format(int.from_bytes(string.encode('utf-8'), byteorder='big')))

def main():
    for line in LIST:
        print("string {0}".format(line))
        generate_string2numberic(line)

if __name__ == '__main__':
    main()

考察

  • 他にもっと良い方法があるかもしれないが、現時点で思いつく方法をメモしておきます。

参考

0
0
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
0
0