人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

[PHP] 文字列をもとに、一意となる短いキーを作りたいです。目的は、その文字列のファイル名のファイルを作りたいからです。

1) 2バイト文字を含む長い文字列がキーとなるデータがある
2) 1データ毎にファイルを作りたい
3) ファイル名長に制限があるのでキーとなる文字列を短くしたい

例)
キー「りんごのデータ」
キー「みかんのデータ」

キーを元に短い文字列を作成

キー「りんごのデータ」→ 短いキー「apple」
キー「みかんのデータ」→ 短いキー「orange」

ファイルを作成

apple.txt
orange.txt


データ取得時にはキーを使用

キー「りんごのデータ」から apple.txt を抽出


※このとき、キー←→短いキー(ファイル名)は可逆でどの方向にも
一意になるものとします。※


この、キーを生成するプログラムが知りたいです。


よろしくお願いいたします。

●質問者: k2017
●カテゴリ:ウェブ制作
✍キーワード:Apple Orange txt [php] みかん
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● Chiether
●80ポイント ベストアンサー

文字列長が不明なので厳密に一意というのは無理かと思います。

特に「長いキー」から「短いキー」にするという事は、その時点で可逆圧縮するので「結果、短くならない可能性」もあります。

なので私は代替しか提案できませんが、「変換履歴ファイル」を別に保存しておくのが一番だと思います。

[trans.dat]

0001,200606020116,りんごのデータ

0002,200606020132,みかんのデータ

これで 0001.txt, 0002.txt ... と生成していきます。

新しくキーが登録された場合は「行数」から連番を生成等でもかまいません。

あるいは、いっその事……このキー関連付けを連想配列にして動的に生成されるファイルをincludeするという荒業もあります。

※ 以下コード、面倒なので文字エスケープとか例外とか省略

[main.php]

include "trans.php";

echo $transdata[りんごのデータ];

[trans.php] (このファイルを動的に生成する)

$transdata["りんごのデータ"] = "apple";

$transdata["みかんのデータ"] = "orange";

// もしくは array関数で一度に登録

[addkey.php]

$key = "ぶどうのデータ";

$data = "grape";

$fp = fopen("trans.php","a");

fputs($fp,"transdata[\"$key\"] = \"$data\";\n");

// array関数で登録している場合はもうちょい複雑。

この荒業の欠点は、キーができればできるほどメモリ消費するという事です。

◎質問者からの返答

定義ファイルの作成は私も最初に考えました。ただ、書き忘れましたがキーは数十万件になり、少なくはないです。連想配列は思いつきませんでした。

大変参考になりました。ありがとうございます。実現方法のひとつとして考えたいと思います。


2 ● i_kumagoro
●5ポイント

ファイル名のバイト列を可逆圧縮してbase64みたいな方法で文字列化すれば一応目的の様な事はできるとは思います。しかし、Chietherさんが書かれた通りで、ファイル名がある一定の長さを越えない保証はありません。

やはり代替案になりますが、キーと短いキーとの対応表をデータベースに保存してはいかがでしょうか。大規模であればそっちの方がパフォーマンスがよくなります。

また、2.の要望には反しますが、いっその事データベースにファイルの内容も入れてしまえば、そもそも短いキーも作る必要がなくなります。

◎質問者からの返答

データベースと仰っているのは上で出ている定義ファイルと同じだと思います。レコード数が多い分パフォーマンスも低いです。同じことを書かないでください。


3 ● zebevogue
●1ポイント

完全に要望に一致するかわかりませんが、

md5を使えば一意で32文字固定になります。

但し、ハッシュなのでファイル名から元の文字への復元はできません。長い名前からハッシュは得られますから特定のファイルへのアクセスは問題ありません。

対策としてはファイルの中の1行目に長い名前自体を入れるとか、別ファイルやDBに対応表を格納していけばいいと思います(格納されていない組み合わせの場合は追加とか)。

◎質問者からの返答

復元できないのでは話しになりません。別ファイルの案は上で出ています。同じことを書かないでください。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ