短縮ハッシュ値の生成
データベース(SQLite)への値の特定用idとして「id integer primary key」とはしているが、これだと最終項目を削除した際に新規追加でその値を取るものが出てきて都合が悪い(削除せずにフラグでオフにしてもいいかもしれないが、それはそれで…)。
→「integer primary key」の削除時の重複除外は「autoincrement」を付ければよかったらしい。
このため別の文字列idとして、phpだとuniqid()関数(とrand()やmd5()と組み合わせたり)を使ったりしている:
- PHP: uniqid – Manual
- より高速に、推測困難な一意なIDを生成する方法 – [サンプルコード/PHP] ぺんたん info
- md5は衝突性(コリジョン)があることが証明されていて、セキュリティホールとなることが潜在的に存在します。
- uniqid
- $better_token = md5(uniqid(rand(), true)); // よりよい方法。推測されにくくなります
- PHPユニークIDの自動生成について
- PHPで一意な値を生成する – takami_hirokiの日記
- PHPでユニークなIDを生成する:uniqid() – kakakakakku blog
(って、見てたらmd5()はコリジョン発生があるから止めとけ(sha1()を使え)とのお達しが。)
これで生成されるid長が、次のようになっていて:
種類 | id長 | 生成例 |
---|---|---|
uniqid() | 13 | 52afc0e354a11 |
uniqid(rand()) | 約23 | 1cdab095a2b6a1977987159af6432ea0 ※id長はrand()値の範囲による |
md5(uniqid(rand())) | 32 | 1cdab095a2b6a1977987159af6432ea0 |
uniqid()がシステムのマイクロ秒を使っていて重複の可能性があるため、rand()を使った形にしたいが、これをURLのquery文字列に渡すとするとちょっと長ったらしい。
このため、URLにおけるbit.lyやgoo.glのような短縮ハッシュが利用できないかと探してみた。
- Rubyで短縮URLのハッシュ値的なものの実装例 – 130単位
- PHPで短いハッシュ – Qiita [キータ]
- strtr(rtrim(base64_encode(pack(‘H*’, $algo($data))), ‘=’), ‘+/’, ‘-_’);
- 短いハッシュの作り方 – BIGLOBEなんでも相談室
- 短縮URLっぽい文字列の生成方法3つ – 9mの日記
- 1.一方向ハッシュ関数 2.適当な文字列 3.62進数
- いつ消えてもおかしくないプログラミングメモ的な何か: [PHP]URL短縮用62進数ハッシュ
- DBに登録された自動発番の数値を単純に0-9,a-z,A-Zの62進数で変換します。
- 1日で作るURL短縮サービス :: WORKLINE
- ハッシュに使う文字は、アルファベットの大文字・小文字がそれぞれ26種類ずつと、0~9までの数字の10種類、計62種類
- 短縮URLなどのランダム文字列を作りたい – 創作メモ帳
- 調べていていいなと思ったのは基数変換を使った方法。
- Simple Shorten URL – OTCHY.NET
- bit.ly API|短縮URL|Web関連特集|PHP & JavaScript Room
- bit.lyのAPIを使ったURLの短縮と元ソースの表示をするPHPスクリプト|A Day In The Boy’s Life
- URL短縮サービスのbitly APIをPHPで利用する方法
- 今更、Google URL短縮APIを試してみた。for PHP | メモ帳代わりのブログ
- YOURLSで独自の短縮URLサービスを設置 | プラスター業務日記
- PHP製の短縮URL作成システム「Shortcore」|オープンソース・ソフトウェア、ITニュースを毎日紹介するエンジニア、デザイナー向けブログ
- twitterからのアクセスがありがたいので、短縮URLについていろいろ調べてみた – にゃんくるアパートメント Blog
- なぜ短縮URLはダメなのか – モジログ
- 短縮URLは負債となる可能性が高いので作ることに恐ろしく躊躇する – キモブロ
- 「短縮URL」って枯渇しないのですか? たとえば htn.to のだとア.. – 人力検索はてな
- Travellers Tales : リンク切れが起こらない URL 短縮サービス LookLeap
Qiitaのkoriymさんのものがよさそうな感じ。7文字程度で済みそうです。もうちょっと長くてもいいですが。
使用時には、md5()も衝突するっていうし、短縮ハッシュだとなおさら追加時の衝突チェックは不可避ですかね。