Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】MHASH_FNV164定数の使い方

MHASH_FNV164定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

MHASH_FNV164定数は、PHPのmhash拡張機能において、特定のハッシュアルゴリズムであるFNV-1a 64ビットを指定するために用いられる定数です。ハッシュ関数とは、入力された任意の長さのデータから、固定長の短いデータ(ハッシュ値やメッセージダイジェストと呼ばれるもの)を生成する一方向性の関数のことを指します。

このMHASH_FNV164定数は、特にmhash()関数や関連する関数を使用する際に、利用したいハッシュアルゴリズムとしてFNV-1a 64ビットを指定するために使用されます。FNV-1a 64ビットは、比較的高いパフォーマンスでハッシュ値を計算できる特性を持つアルゴリズムの一つで、データの同一性チェックや、データの内容が改ざんされていないかの簡易的な検証など、様々な場面で利用されます。

開発者がMHASH_FNV164定数を使用することで、コード内で直接アルゴリズムの名前を文字列で指定する代わりに、この数値定数を利用し、より安全で可読性の高いコードを書くことができます。これにより、プログラムは指定されたデータに対してFNV-1a 64ビットアルゴリズムを用いてハッシュ値を生成し、その結果を後続の処理で利用できるようになります。これは、特定のセキュリティやデータ整合性の要件を持つアプリケーション開発において、重要な役割を果たす定数の一つです。

構文(syntax)

1<?php
2$algorithmId = MHASH_FNV164;
3?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP 8 FNV-1a 64ビットハッシュを生成する

1<?php
2
3/**
4 * 指定された文字列のFNV-1a 64ビットハッシュを生成します。
5 *
6 * PHP 8では、mhash拡張(およびMHASH_FNV164定数)は削除されました。
7 * 代わりに、hash()関数と'fnv1a64'アルゴリズムを使用することが推奨されます。
8 * この関数は、MHASH_FNV164が提供していたFNV-1a 64ビットハッシュの機能を提供します。
9 *
10 * @param string $data ハッシュを計算する対象の文字列。
11 * @return string 生成されたFNV-1a 64ビットハッシュ(16進数文字列)。
12 */
13function generateFnv1a64Hash(string $data): string
14{
15    // hash()関数を使用してFNV-1a 64ビットハッシュを計算します。
16    // 'fnv1a64'はhash()関数がサポートするアルゴリズム名です。
17    return hash('fnv1a64', $data);
18}
19
20// -- サンプルコードの実行例 --
21
22// ハッシュを生成したい文字列を準備します。
23$inputString = "Hello, System Engineers! This is a sample string for FNV-1a 64-bit hashing.";
24
25// generateFnv1a64Hash関数を呼び出してハッシュを計算します。
26$fnv1a64Hash = generateFnv1a64Hash($inputString);
27
28// 結果を出力します。
29echo "元の文字列: " . $inputString . PHP_EOL;
30echo "FNV-1a 64ビットハッシュ: " . $fnv1a64Hash . PHP_EOL;
31
32?>

PHPのMHASH_FNV164は、かつてFNV-1a 64ビットハッシュを生成するために使われていた定数です。しかし、PHP 8からはmhash拡張機能が削除されたため、この定数は利用できなくなりました。

現在のPHPでFNV-1a 64ビットハッシュを生成する際は、標準のhash()関数を使用することが推奨されています。サンプルコードでは、このhash()関数を使い、アルゴリズム名として'fnv1a64'を指定してハッシュを計算するgenerateFnv1a64Hash関数が定義されています。

このgenerateFnv1a64Hash関数は、ハッシュを計算したい文字列を引数$dataとして受け取ります。受け取った文字列に対し、hash()関数を用いてFNV-1a 64ビットハッシュを計算し、その結果を16進数形式の文字列として戻り値で返します。

サンプルコードの実行例では、「Hello, System Engineers! ...」という文字列を$inputStringに格納し、generateFnv1a64Hash関数に渡してハッシュを生成しています。その結果、元の文字列と計算されたFNV-1a 64ビットハッシュが画面に出力され、PHP 8以降で安全にFNV-1a 64ビットハッシュを利用する方法が具体的に示されています。

PHP 8以降では、古いmhash拡張に含まれるMHASH_FNV164定数は削除され、直接使用できませんので注意が必要です。過去のPHPコードでこの定数を使っている場合、PHP 8で実行するとエラーが発生します。現在は、サンプルコードのようにhash()関数を用いて、アルゴリズム名として'fnv1a64'を指定する方法が推奨されています。この新しい方法で、同等のFNV-1a 64ビットハッシュを安全に生成できます。プロジェクトでPHP 8へアップグレードする際は、ハッシュ関連のコードを必ず見直し、新しい方式に移行してください。

PHPでFNV164ハッシュを計算する

1<?php
2
3/**
4 * 指定された文字列をFNV-1 64ビットアルゴリズムでハッシュ化する関数。
5 * MHASH_FNV164定数を使用するにはmhashエクステンションが必要です。
6 *
7 * 注意: PHP 7.1.0以降、mhashエクステンションはPHPコアから削除されています。
8 * PHP 8環境でこの定数を利用する場合、PHPをビルドする際に
9 * `--enable-mhash`オプションを有効にする必要があります。
10 *
11 * @param string $data ハッシュ化したい文字列。
12 * @return string ハッシュ化された文字列(バイナリ形式)。
13 */
14function calculateFnv164Hash(string $data): string
15{
16    // mhashエクステンションがロードされているか確認します。
17    // ロードされていない場合、MHASH_FNV164定数は未定義となります。
18    if (!extension_loaded('mhash')) {
19        die("エラー: mhashエクステンションが有効になっていません。\n"
20            . "この定数を使用するには、PHPのビルド時に--enable-mhashオプションを有効にする必要があります。\n");
21    }
22
23    // MHASH_FNV164定数を使用して、FNV-1 64ビットアルゴリズムでデータをハッシュ化します。
24    // mhash関数はバイナリ形式のハッシュ値を返すため、そのまま表示すると読みにくい場合があります。
25    $hashBinary = mhash(MHASH_FNV164, $data);
26
27    return $hashBinary;
28}
29
30// ----------------------------------------------------
31// 以下は関数の使用例です。
32// ----------------------------------------------------
33
34// ハッシュ化したい元の文字列を定義します。
35$inputString = "Hello, PHP beginners learning about FNV-1 64-bit hash!";
36
37echo "元の文字列: " . $inputString . "\n";
38
39// FNV-1 64ビットアルゴリズムでハッシュ値を計算します。
40$binaryHash = calculateFnv164Hash($inputString);
41
42// mhash関数が返すのはバイナリデータなので、可読性のために16進数文字列に変換します。
43$hexHash = bin2hex($binaryHash);
44
45echo "FNV-1 64ビットハッシュ値 (16進数): " . $hexHash . "\n";
46
47// 別の文字列でハッシュ計算を試します。
48$anotherInputString = "System Engineering is fascinating!";
49echo "\n別の文字列: " . $anotherInputString . "\n";
50$anotherBinaryHash = calculateFnv164Hash($anotherInputString);
51$anotherHexHash = bin2hex($anotherBinaryHash);
52echo "FNV-1 64ビットハッシュ値 (16進数): " . $anotherHexHash . "\n";
53
54?>

PHPのMHASH_FNV164は、「FNV-1 64ビットアルゴリズム」という特定の計算方法を用いてデータをハッシュ化する際に指定する定数です。ハッシュ化とは、任意の長さのデータを固定長の短い値に変換する技術で、データの同一性チェックや改ざん検出などに利用されます。

この定数は、PHPのmhash()関数と組み合わせて使用します。mhash()関数の最初の引数にMHASH_FNV164を指定することで、入力された文字列をFNV-1 64ビットアルゴリズムでハッシュ化します。サンプルコードのcalculateFnv164Hash関数は、ハッシュ化したい文字列(引数$data)を受け取り、mhash(MHASH_FNV164, $data)として計算されたハッシュ値をバイナリ形式の文字列として返しています。

特に重要な点として、PHP 8環境でMHASH_FNV164定数を利用するには、「mhashエクステンション」をPHPに組み込む必要があります。これはPHPをビルドする際に--enable-mhashオプションを有効にすることで実現できます。このエクステンションが有効でない場合、定数は未定義となり、エラーが発生します。

mhash()関数が返すハッシュ値はバイナリ形式のため、人間が読みやすいようにサンプルコードではbin2hex()関数を使って16進数表記に変換して表示しています。これにより、元の文字列が異なる場合に、異なるハッシュ値が生成されることを確認できます。

このサンプルコードは、FNV-1 64ビットアルゴリズムを使用して文字列をハッシュ化する方法を示しています。最も重要な注意点は、MHASH_FNV164定数がPHPの標準機能ではなく、mhashエクステンションが必要となる点です。PHP 7.1.0以降、mhashエクステンションはPHPコアから削除されており、PHP 8環境でこの定数を利用するには、PHPをビルドする際に--enable-mhashオプションを明示的に指定して有効にする必要があります。エクステンションが有効でない場合、コードは動作せずエラーとなりますのでご注意ください。また、mhash関数はハッシュ値をバイナリ形式で返します。そのため、ハッシュ値を可読性のある形で表示するには、bin2hex関数などを使用して16進数文字列に変換すると良いでしょう。

関連コンテンツ

関連プログラミング言語