ハッシュ値 SHA-256 in Python – 数値計算関数の実装


この記事は、 SHA256を計算する in Pythonのステップ1です。

SHA-256 の計算の中には、 2乗根、3乗根の計算が出てきます。 ハッシュとして生成される最終的な値をできるだけランダムにするために、素数の2・3乗根を計算して使用します。 この2・3乗根は定数として与えられるので(PDFに記述されていた)、わざわざ計算する必要はないのですが、いちいち書き写すのも面倒なので、2・3乗根を計算する関数を作成しておきます。 尚、Pythonでは ** (1/2), ** (1/3) を数値の後ろにつければ 2・3乗根を計算できますので、効率を求めるならわざわざ実装する必要はありません。

SHA-256 の計算では、 小さい方から 1〜64番目 の素数を使います。 64個なら書いてしまうのもいいですが、64個も書き写すと間違えそうです。 Python で素数を計算します。 こちらもライブラリを使って効率よく済ませることもできます。

2乗根

開平法をPythonで記述します。 開平法は、正の数の平方根を計算する方法です。 数学ハンドブック (石川 博朗) で見たことがあります。

このプログラムは、そんなに精度高くないです。 sqrt(121) は 11 にはならず、 10.999999999999988 になります。 しかし、 SHA-256 を計算する上ではこの程度で十分です。

3乗根

開立法(かいりゅうほう)をPythonで記述しました。 開立法は正の数の立方根を計算する方法です。 開立法は3乗というだけあって開平法よりも難しいですが、YouTubeにわかりやすくまとまっていました。

こちらも上の sqrt と同じように、 SHA-256 の計算では十分な精度になっています。 1000以上の3乗根は計算できませんが、 それでも SHA-256 の計算には十分です。 sqrt のように 10 ** 3 で割ったり、 また掛けたりすれば、精度はともかく1000以上の数値についても計算できるようになります。

素数

ある数が素数であるかどうかは、その数の2乗根以下の素数で割れば確認できます。 2乗根の計算には、 上で実装した sqrt を用いていますが、 精度がよくないので sqrt の計算結果に手を加えています。

計算結果は繰り返し使用できるので、クラスを作成してインスタンス変数を利用しています。 SHA-256 の計算でクラスの外から呼び出されるのは numbers です。 この関数で、素数のリストを返します。

テスト

doctest を使ってテストしておきます。 ファイルの下の方に次のコードを書いて実行します。

このテストの記述は、この後の実装でも役に立ちます。

次のステップは 変換関数の実装 です。