背景・目的
- とある作業で、文字列を数値化する必要があったので作業ログとして残します。
- 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()
考察
- 他にもっと良い方法があるかもしれないが、現時点で思いつく方法をメモしておきます。
参考