ハッシュ値の求め方

GCSの名前は、後から変更できないし、Google Cloudのページにもこうやって書いてある。

ユーザー ID、メールアドレス、プロジェクト名、プロジェクト番号、個人を特定可能な情報(PII)をバケット名に使用しないでください。バケットの存在を誰でも調べることができます。同様に、オブジェクト名に PII を使用する場合にも十分に注意してください。オブジェクト名は、オブジェクトの URL に表示されます。
(Google Cloud Storage のベスト プラクティス)

とはいえテケトーに決めるのは意外と難しい。ランダム文字列でも作ろうか・・と思って軽くググると、システム的なものならハッシュ値で作ればいいやんという情報を得たので、pythonでテケトーなハッシュ値を得るコードを書いた記録です。(今後はここをコピペすれば生成できるように。)

import hashlib
from datetime import datetime

hashlib.sha256(
   datetime.now().strftime('%Y%m%d%H%M%S').encode()
).hexdigest()
# 'c237a3f5e042f837e66ec518b60683bad8f51e1fad58e957cc1e42cd7901a325'

ここから余談(の方が長い)

ところでハッシュ値、でかいファイルをDLするときに配布元に書いてあったり、証明書関連で現れたりするので、署名的なものかなーと思ってたのですが誤りでした。任意長のバイト列から生成される固定文字列長でした。なので、上記のような日時を文字列にしたものからも生成できるし、バイナリファイルからも生成できるという代物。

でもでかいファイルは、メモリ的に一気にsha256()の関数に入れられない。それはどうなっているかというと、ちょっとずつ入れても、まとめて入れても同じ結果を得るという性質を持っていて、それを利用して計算しているとのこと。すごい。なので試してみました。

import hashlib

# 一気に'abc'
print(hashlib.sha256('abc'.encode()).hexdigest())
# ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

# 1文字ずつ'a' 'b' 'c'
h = hashlib.sha256()
h.update('a'.encode())
print(h.hexdigest())
# ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb
h.update('b'.encode())
print(h.hexdigest())
# fb8e20fc2e4c3f248c60c39bd652f3c1347298bb977b8b4d5903b85055620603
h.update('c'.encode())
print(h.hexdigest())
# ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

できた!一気に作ったのと、1文字ずつ作ったのが同じ!ついでに、a、bのときは全然違う!

ということで話は戻ってGCSのパケット名は、日時で生成しましたとさ。(あ、名前の長さに制限があったので、適当に切って短くして。)

この記事が気に入ったらサポートをしてみませんか?