2ch(2ちゃんねる)のIDのようなIDの作り方
更新:2026-04-28
掲示板サイト2ちゃんねる(現5ちゃんねる、5ch)に書き込むと ID:U+5EtO9y という形式のIDが表示される。 それに似たIDを作成する方法をPHPでいくつか用意した。 需要があるかは不明。
hexdec、剰余計算版
基本は後述の「sha512、base64」と同じ。 ただ、md5やsha256などのハッシュ値は16進数の文字列なので、それをbase64でエンコードし、それを加工しても似たような文字列ばかり生成される。
そこで生成したハッシュ値をまず10桁ずつ分割して配列にする。 それらを10進数に変換し、$alphabet の文字数(配列数)で剰余を計算する。 その値をキーとして $alphabet から文字を抽出する。
わりとそれらしきIDが生成される。
$ip = "203.24.112.29";
$date = date('Y-m-d');
$alphabet = mb_str_split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./+-=');
$alphabet_count = count($alphabet);
$str_all_hash = hash('sha512', $ip . $date);
$str_all_hash_list = str_split($str_all_hash, 10);
$id_list = array();
foreach($str_all_hash_list as $value){
$alphabet_key = hexdec($value) % $alphabet_count;
$id_list[] = $alphabet[$alphabet_key];
}
$id = implode('', $id_list);
echo $id;
sha512、base64版
後述の昔書いたコードを改良したもの。
base64だけだとIDに「=」以外の記号が含まれないので、IDに使いたい文字列($alphabet)を自分で用意する。 IPアドレスと日付のみ使用。 hashとbase64_encode関数を利用して文字列を生成。 各文字の $alphabet から13個ずらした文字をIDに使用する。
$ip = "203.24.112.29";
$date = date('Y-m-d');
$alphabet = mb_str_split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./+-=');
$alphabet_count = count($alphabet);
$str_all_hash = hash('sha512', $ip . $date);
$str_base64 = base64_encode($str_all_hash);
$id64 = array();
foreach(str_split($str_base64) as $value){
$str_key = array_search($value, $alphabet);
$str_key_shift = $str_key + 13;
if($str_key_shift >= $alphabet_count ){
$str_key_shift = $str_key_shift - $alphabet_count ;
}
$id64[] = $alphabet[$str_key_shift];
}
$id = substr(implode('', $id64), 0, 12);
echo $id;
md5、base64版
PHPのmd5、base64_encode関数を利用して5chっぽいIDを作成する。
かなり昔に書いたコード。
ユーザーのIPアドレスをもとにハッシュ値を生成する。 日付が変わった時にIDを変える場合、IDの生成に日時を含める。
$ip = "210.221.12.10";
$str_md5 = substr(md5($ip), 0, 30);
$date_md5 = substr(md5(date("Y-m-d")), 0, 20);
$key_md5 = substr(md5("examplekey"), 0, 10);
$id_md5 = md5($str_md5 . $date_md5 . $key_md5);
$id = substr(base64_encode($id_md5), 0, 8);
echo $id;