文字列から任意の数値を得られる方法はないでしょうか。



もう少し詳しく書くと、名前から四桁の数値を得られるような感じだと良いと思うのですが・・・


山田太郎 -> 1534


脳内メーカーのような、結果表示の振り分けに使いたいと思っています。


md5 や url エンコードで符号化する方法も考えたのですが、その場合だと英数字が多くなってしまい、結果の幅が広りすぎてしまうため、任意の感じを0~9に振り分けられるのがよいと思っています。


最終的にいい方法がなければ、アルファベットの25文字をゾーンに分けて 0~9 を割り振ろうと思いますが、もう少しスマートな方法があればよいと思っています。

回答の条件
  • 1人2回まで
  • 登録:2008/01/02 18:27:12
  • 終了:2008/01/09 18:35:03

回答(5件)

id:STRing No.1

STRing回答回数351ベストアンサー獲得回数362008/01/02 19:10:24

ポイント20pt

http://www.wdic.org/w/WDIC/CRC

巡回冗長検査 - Wikipedia

CRC を使うのはどうでしょう?

id:ryuzi_kambe

PHP にも「crc32($string)」という関数があるようですので、

ためしてみます。

2008/01/03 18:51:39
id:streakeagle No.2

streakeagle回答回数37ベストアンサー獲得回数22008/01/02 19:11:12

ポイント20pt

「任意の感じを0~9に振り分けられるのがよい」と言う事なら((感じ→漢字と読み替えました))、文字コードを10で割った余りを使えばいいのではないでしょうか?

これなら“山田太郎”さんと“山田花子”さんは上位2桁が同じ数字になります。

(ただし、この場合は文字列の長さが4以外の場合の処理が別に必要になりますが。)

id:ryuzi_kambe

あ~、MS-IME のせいにしてはいけませんが、頭にくる間違いですね>漢字

10で割るのはいいアイディアかもしれませんが、文字コードを16進数かなにかととらえるのでしょうか?

どういう計算が出来るのか示していただけるとありがたいです。

2008/01/03 18:53:44
id:hrkt0115311 No.3

どんジレ、どんさん回答回数892ベストアンサー獲得回数512008/01/02 20:43:03

ポイント20pt

こんばんは。オープンになっていない他の回答者さんと重複したら恐縮です。


この分野に関してはほとんど知識がないので、お役に立てなかったらすみません。

md5 を試されたとのことですので、釈迦の耳に説法かと存じますが、過去質問のhttp://q.hatena.ne.jp/1193982965が興味深かったので参考までに紹介させていただきます。何かヒントがあるといいのですけれども。


また、下記ジェネレーターでは、暗号式に関してCGIスクリプトを公開しています。資料にならないだろうかと考え、URLを紹介させていただきました。

http://anime.geocities.jp/coil_generator/

http://anime.geocities.jp/coil_generator/script.html



以上、少しでも参考になれば幸いです。

id:ryuzi_kambe

ほかの質問をご紹介いただき、ありがとうございました。

自作ハッシュ関数をつくるのがよさそうですね。。

2008/01/03 18:50:23
id:streakeagle No.4

streakeagle回答回数37ベストアンサー獲得回数22008/01/03 22:12:19

ポイント20pt

回答2.の補足です。

Javaであれば下記の様な処理で可能だと思います。(PHPは知らないもので・・・すいません。)

char[] name;// この配列の0~3に氏名が入っていると仮定。

int code = 0; // 氏名に対応する数値。
code += ( name[ 0 ] % 10 ) * 1000;
code += ( name[ 1 ] % 10 ) *  100;
code += ( name[ 2 ] % 10 ) *   10;
code +=   name[ 3 ] % 10;

「名前は4文字」と仮定して書いた汚いコードですが、これが回答2で書きたかった事です。

id:ryuzi_kambe

char 型に入れた場合10で割った余りが int に型変換可能な値に

なっているというところは Java 特有の気がしますが、PHP でも

文字列を無理矢理数値で割ってどのような余りの値が出てくるのか

確かめてみることにします。回答ありがとうございました。

2008/01/03 23:22:46
id:ardarim No.5

ardarim回答回数892ベストアンサー獲得回数1422008/01/05 12:27:11

ポイント20pt

数値の重複をできるだけ避けたいということであれば、md5やsha1など既存の効果が確認されているハッシュアルゴリズムを使うのがよいと思います。

phpが前提のようですが、phpでもmd5やsha1を扱うことができます。


これらのハッシュは数値4桁そのものではありませんが、できたハッシュ(16進文字列)を10進数値化して任意の4桁を取るなど4桁に圧縮すればよいと思います。完全に重複が避けられるわけではないですが、一から自作するよりはましのはずです。

id:ryuzi_kambe

ありがとうございます。重複がさけられるよう、8桁にしたりしてもよいですよね。参考になる回答、ありがとうございました。

2008/01/08 15:24:41

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません