- ベストアンサー
数値・文字列を決まった範囲の数値に変換・割り当てる方法とは?
- ハッシュ関数を使用して、数値・文字列を指定された範囲の数値に変換・割り当てる方法について説明します。
- この方法では、ハッシュ関数が与えられた入力値を特定の範囲に変換することによって、ランダムでなく繰り返し同じ結果を得ることが可能です。
- 範囲は自由に変更でき、例えば「1~95」「1~230」「1~500」といった範囲を指定することができます。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
んーと、こちらの質問の方ですよね。 http://questionbox.jp.msn.com/qa5684585.html ↑こちらでも回答されてるように、ハッシュ値の一部を利用する形になるかと思います。 md5のハッシュ値は 32文字の16進数。別の言い方をすれば 128ビット。 これを、計算すると 2の128乗で 340,282,366,920,938,463,463,374,607,431,768,211,456 ですので、 md5のハッシュ値は 天文学的な数字になることが分かります。 はい。ここまで、ただの雑談です。 32文字の16進数の文字列で返されるわけですので、 最後の一文字だけを使ったとすると、16通り(0~F)、 二文字を使ったとすると 256通り(00~FF)、 三文字を使ったとすると 4096通り(000~FFF)になります。 これを、そちらの希望するパターン数に割り振るわけです。 割り振り方のシンプルなやり方としては、「1~95」の95通りでやりたいと思った場合、 ハッシュ値の2文字を使い、(256 / 95) の 「余り」を出します。 余りは 0 ~ 94 の範囲になりますので、それに 1 加算して 「1~95」にします。 数式で書くと $a = (256 % 95) +1 です。 [ % ] は 余りを出す演算子です。 そちらの希望するパターン数で 割り切れない場合は、偏りが発生します。 上記の例の場合で、(0~65)までは3通り、(66~94)までは2通りです。 俺、特有の症状で、説明してて自分で分からなくなるという状況に陥りましたので、 ここらで やめたいと思います。 前回の方が回答したとおり、ハッシュ値の一部を使うという事、 それを、割って余りを出すような方法で 自分の希望するパターン数に割り振る事。 俺が回答として 言いたかったのは それだけです。
お礼
早速ありがとうございます! 余りを出して計算するのですか! 目からウロコです。そういう方法でやるのですね! 偏りが発生すると言う点も理解できました。 本当はぴったり割り切れるようなデータにした方が均等に割り振る事ができるということですね。 早速ご教示いただいた内容で試してみたいと思います。 本当にありがとうございました。