2
1

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 3 years have passed since last update.

PHPによる数値の諸処理と乱数

Last updated at Posted at 2020-09-24

#目次
数値を3桁ごとに区切る
数値を小数点以下まで表示させる
乱数を生成する
ランダムな文字列を作成する
ユニークIDを生成する

#数値を3桁ごとに区切る
number_format()関数を使う
第二引数で指定した小数点の桁より下は切り捨てられる
引数を指定しない場合は小数点以下が切り捨てられる
有効桁数は14桁でそれ以上はプラットフォームによる

example.php
echo number_format('98765432.1'); //98,765,432
echo number_format('110', 2); //110.00

#数値を小数点以下まで表示させる
sprintf()関数かnumber_format()関数を使う

sprintf()関数を使う場合は%02fのように指定すると少数第二位までの表示が、%05fとすると少数第五位までが表示できる

number_format()関数を使う場合は第二引数に小数点第何位までを表示するか指定することができる
カンマ区切りが不要な場合は第三引数にピリオド、第四引数に空文字を指定する
#乱数を生成する
mt_rand()関数を使う

example.php
mt_rand(int $min, int $max): int

引数を設定しない場合は0からmt_getrandmax(): intの値を返す
乱数を生成する場合はシード値を基にして決まった計算方法で求められるため、
同じシード値からは同じ値が同じ順番で生成されるため、暗号学的に安全ではない
mt_rand()関数のシード値は自動的に決められるため設定はいらない
#ランダムな文字列を作成する

example.php
<?php
//generateRandomString()関数
//第一引数には文字数
//第二引数には使用する文字
function generateRandomString(int $len, string $elem = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-=/!@#$%^&*()_+~`'): string
{
	if ($len <= 0) return false;
	if (!preg_match('/\A[\x21-\x7e]+\z/', $elem)) return false;
	$chars = preg_split('//', $elem, -1, PREG_SPLIT_NO_EMPTY);
	$chars = array_unique($chars);
	$bytes = getRandomBytes($len);
	if (strlen($bytes) <= 0) return false;
	$str = '';
	$charsLen = count($chars);
	for ($i = 0; $i <= $len; $i++) {
		//バイト文字からASCII値を取得して剰余演算で配列の添字を決定
		$str .= $chars[ord($bytes[$i]) % $charsLen];
	}
	return $str;
}

//getRandomBytes()関数
//暗号学的に強いアルゴリズムで生成した乱数のバイト文字列を返す
function getRandomBytes(int $len): string
{
	$bytes = '';
	if (function_exists('openssl_random_pseudo_bytes')) $bytes = openssl_random_pseudo_bytes($len, $usable);
	if ($usable == false) $bytes = '';
	return $bytes;
}

暗号学的に安全な関数
OpenSSL拡張モジュールが必要なのでfunction_exists())関数でチェック

#ユニークIDを生成する
uniqid()関数を使用する
第一引数を空文字で実行すると13文字の文字列が生成される
第一引数に文字列を指定するとそれが文頭につく
第二引数にtrueを指定すると23文字のより推測されにくい文字列が生成される

example.php
echo uniqid(); //xxxxxxxxxxxxx
echo uniqid('', true); //xxxxxxxxxxxxxxxxxxxxxxx
echo uniqid('no.'); //no.xxxxxxxxxxxxx

uniqid()関数はマイクロ秒単位で変化するので同じマイクロ秒であれば同じIDが生成されてしまう可能性がある
mt_rand()関数で乱数を指定すれば異なるIDを生成できる
md5()関数を使うことで桁数の揃ったIDを生成できる

example.php
echo md5(uniqid(mt_rand(), true))
2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?