MicroPython上でも使えるCPython(フルのPython実装)のサブセット・モジュールを見てます。今回はhashlibとな。この年寄はMD5計算できればいいんじゃね、くらいのいい加減さ。ESP32版のMicroPythonみたらばMD5は割愛されてました。SHA256使え(SHA1もある)ということみたい。
※「MicroPython的午睡」投稿順 Indexはこちら
hashlib
シビアな用途でなくて、自分でファイルを読み書きする程度のアプリでもバージョンの不整合とか検出するのにハッシュなど計算するのがお楽。まあそんなときはMD5で十分かと。短いし。でも近代的なプログラムでは非推奨とな。
hashlibはMicroPythonでも実装されています。いつもお世話になっておりますMicroPythonの日本語版ドキュメントが以下に。
上記のページを拝見すると一応アルゴリズム的には以下3種が存在するようではあるのです。
-
- SHA256
- SHA1
- MD5
しかし、SHA256はMicroPythonコアに含まれているのでどのポートでもサポート、SHA1はインターネットで使われることがあるので、ネットワーク接続想定のポートでサポートされるオプション、MD5は古いので相互運用上必要な場合のみサポートされる。。。てな書きぶりです。上から順ね。
今回使用してます ESP32版のMicroPythonで見てみると以下のようでした。
WiFi搭載していてネットワーク接続がもれなく使えるESP32なのでSHA256に加えてSHA1をサポート、MD5は残念、という感じデス。
実験用のソースその1
実験は簡単にしました。MicroPythonのストレージにTEXTファイルを書き込み。その際にテキスト行からSHA256でハッシュを計算しておきます。後で、TEXTファイルを読み取って読み取りデータからSHA256を再計算して一致すればOK。アリガチな。以下はファイル書き込み時用。
import hashlib, binascii def main(): testSTR = "ESP32, store text file and calculate sha256 HASH." print(testSTR) hash = hashlib.sha256() with open("hashTST.txt", mode='w') as f: f.write(testSTR) hash.update(testSTR) print(binascii.hexlify(hash.digest())) if __name__ == "__main__": main()
実験用のソースその2
以下はファイル読み取り時用。
import hashlib, binascii def main(): testSTR = "ESP32, load text file and calculate sha256 HASH." print(testSTR) hash = hashlib.sha256() with open("hashTST.txt", mode='r') as f: for lin in f: print("READ> ", lin) hash.update(lin) print(binascii.hexlify(hash.digest())) if __name__ == "__main__": main()
読み書き実験
さて、上記のファイル書き込みプログラムを走らせたところが以下に。黄色のマーカ引いてあるのがSHA256ハッシュです。
つづいて、ファイル読み込みプログラムを走らせたところが以下に。読み取った行から計算したSHA256ハッシュがやはり黄色のマーカ部に。
一応、一致しとるみたいですな。それこそホントはbtreeデータベースにでも登録しておいて後で比較すれば良いのだけれど。今回は(今回も)手抜き。