6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Delphi】ハッシュ値を生成する

Last updated at Posted at 2023-08-18

はじめに

Delphi には XE8 以降、System.Hash.pas ユニットが提供されており、各種ハッシュ値生成用の高度なレコード型が用意されています。

ハッシュ値の生成

以下、ハッシュ関数の概略とコード例です。

■ Jenkins

Jenkins は 1997年に Bob Jenkins によって開発されたハッシュ関数 (NCHF) です。

Delphi に実装されている THashBobJenkins では 16進値で 8 桁のハッシュ値が生成されます。

■ FNV-1a

FNV は (1991年頃?) Glenn Fowler, Landon Curt Noll, Kiem-Phong Vo によって開発されたハッシュ関数 (NCHF) です。FNV-1a はそのバリエーションです。

FNV-1a にはハッシュ値のサイズとして 32bit、64bit、128bit、256bit、512bit、1024bit がありますが、Delphi に実装されている THashFNV1a32 は 32ビットハッシュ値のみを生成し、16進値で 8 桁のハッシュ値が生成されます。

FNV-1a (THashFNV1a32) は Delphi 11 Alexandria 以降で利用可能です。

■ MD5

MD5 は 1991年に Ronald Linn Rivest によって開発されたハッシュ関数 (CHF) です。

Delphi に実装されている THashMD5 では 16進値で 32 桁のハッシュ値が生成されます。

■ SHA-1

SHA-1 は 1995年に アメリカ国家安全保障局 (NSA) によって開発されたハッシュ関数 (CHF) です。

Delphi に実装されている THashSHA1 では 16進値で 40 桁のハッシュ値が生成されます。

■ SHA-2

SHA-2 は 2001年に アメリカ国家安全保障局 (NSA) によって開発されたハッシュ関数 (CHF) です。

SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256 というの 6 つのバリエーションがありますが、Delphi の THashSHA2 のデフォルトでは SHA-256 が使われます。

Delphi に実装されている THashSHA1 では 16進値で 56~128 桁のハッシュ値が生成されます。

SHA-2 (THashSHA2) は Delphi 10 Seattle 以降で利用可能です。

■ コード例

・文字列からハッシュ値 (文字列) を生成する

最も単純な使い方です。例では THashMD5 を使っていますが、SHA-1 のハッシュ値を得たければ THashSHA1 に変更するだけです。

var Src := 'Hello,world.';
var Dst := THashMD5.GetHashString(Src);

・ファイルからハッシュ値 (文字列) を生成する

ファイルのハッシュダイジェストからハッシュ値を生成します。Jenkins / FNV-1a では利用できません。

var Src := 'c:\Windows\notepad.exe';
var Dst := THashMD5.GetHashStringFromFile(Src);

GetHashStringFromFile() は Delphi 10.2 Tokyo 以降で利用可能です。

・HMAC に適したハッシュ値 (文字列) を生成する

HMAC に適したハッシュ値を生成します。同一の秘密鍵を用いた場合に限り、同じハッシュ値が得られます。Jenkins / FNV-1a では利用できません。

var Key := 'HogeHoge'; // 秘密鍵
var Src := 'Hello,world.';
var Dst := THashMD5.GetHMAC(Src, Key);

・SHA-2 のバリエーションを指定する

SHA-2 のバリエーションを指定してハッシュ値を生成します。コンストラクタのパラメータでバリエーションを指定します。

バリエーション 桁数
SHA224 SHA-224 56
SHA256 SHA-256 64
SHA384 SHA-384 96
SHA512 SHA-512 128
SHA512_224 SHA-512/224 56
SHA512_256 SHA-512/256 64
  with THashSHA2.Create(SHA384) do
  begin
    var Src := 'Hello,world.';
    Update(Src);
    var Dst := HashAsString;
  end;

おわりに

各種ハッシュ値生成用の高度なレコード型を使う際、大抵の事はクラスメソッドで済ませられるようになっているのがお手軽でいいですね。

古い Delphi でハッシュ値を生成するには Indy を使う事になるかと思います。

See also:

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?