匿名掲示板向けのID作成方法

匿名掲示板を運営しようとした場合、荒らしの問題が考えられます。

抑止策として、次のことが考えられます。

  • アクセス制限
  • IPアドレスの開示
  • 書き込みを削除する

ただし、今回はこういった方法を取らずに、某掲示板のようにIDを生成すればいいのでは?と思いました。

理由としては、パっと見悪意がない人から見れば、あまり気にならないだろうと考えたからです。

では、どのようにして作成されているのかを見てみます。

参考:japanism.org - ブログ »Japanism.org» ブログアーカイブ » [開発] 2ちゃんねるのIDの仕組み

IDを生成するには

  1. 書き込んだ人のIPアドレス (※123.123.123.123 など)
  2. 書き込んだ日の日にち (※2008/01/10 なら 10)
  3. 板の名前 (※download など)
  4. 書き込んだ日毎に変化する16桁の数字 (※2830942618337209)

となっています。

まずは、IPアドレスの取得の仕方になります。

railsではrequest.ipで取得することができます。

次に、書き込んだ日の日にち (※2008/01/10 なら 10)はDateメソッドから取得できます。

板の名前はモデル名になると思います。

書き込んだ日毎に変化する16桁の数字は、SecureRandomクラスのメソッドから作成します。

これを保存するデータベースがいるのですが、今回はそれをしない場合でお話しします。

最後に暗号化するために、Digest::MD5を使って、文字数を暗号化します。

Digestは暗号化するという意味で、MD5については、wikiを参考に説明します。

参考:MD5 - Wikipedia

MD5(エムディーファイブ、Message Digest Algorithm 5)とは、与えられた入力に対して128ビットのハッシュ値を出力するハッシュ関数である。

ハッシュ関数が意味不明だったので、これもwikiを参考に説明します。

参考:ハッシュ関数 - Wikipedia

ハッシュ関数 (ハッシュかんすう、hash function) あるいは要約関数とは、あるデータが与えられた場合にそのデータを代表する数値を得る操作、または、その様な数値を得るための関数のこと。ハッシュ関数から得られた数値のことを要約値やハッシュ値または単にハッシュという。

要約すると、ハッシュ関数を用いて、文字を変換する(MD5)→MD5により、変換された文字は複雑な値になっているが、元の値から毎回同じ結果がでる→ただし、変換された文字から元の値を割り出すことは困難である。

計算結果から元の値を割り出すことが困難なので、暗号化に使われているということです。

式をまとめるとこんな感じになります。

    def get_anonymous_name(name)
      user_ip = request.ip
      day = Date.today.day.to_s
      name = name.to_s
      random = get_anonymous_random
      anonymous_name = user_ip + day + name + random
    end

    def get_anonymous_random
      random = SecureRandom.hex(8)
    end

    def get_anonymous_digest(anonymous_name, character_length)
      anonymous_digest = Digest::MD5.hexdigest(anonymous_name).slice(0..character_length)
    end

上の式で名前を取ってきて、下の式で匿名のdigestを作成します。

下の式だと文字数が多いので、適当な数で文字数を切り取ります。

これですごくランダムな変数になりつつ、IPアドレスを元にしたIDが生成できます。

どこまでやるのかっていうのが考えられますが、こんな感じで生成できます。

あとは、書き込んだ日毎に変化する16桁の数字の数字を保存する専用のデータベースを作成する。

ランダムな数値を1日1回だけ生成するように組み、それがあればget_anonymous_randomを使用しないという風にすれば、条件に満たすと思います。

完走はできておりませんが、大まかな概要になります。