hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。 |
ラボ
***作成中***
連想配列とは添え字に自然数を利用する配列に対し、任意の文字列を添え字として使う配列を挿します。
array.0 = "95点" ; 代入 result = array.0 ; 取得
array[国語] = "95点" ; 代入 result = array[国語] ; 取得
HSPでは3で連想配列を言語仕様として導入予定なので今回は2.61をベースに連想配列の実装を考えてみたいと思います。
(私がまだeEasy3Dに合わせ3に手を出していないのも理由w)
HSP3でWindowsのScriptランタイム(JScript,VBScript)を利用する内容はこちら→COMDictionary
このページではHSPによる実装を考えます。
パフォーマンスを考慮せず、上記の機能のみを提供する最小の例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | - | | ! - | | | ! - | | ! - | | ! - | | ! |
|
sdim a a="aa" test a test "bb"のどちらでもOKなのは可能でしょうか?
上のソースを元にHSP3用にして見ました。
map2.0 for hsp3 .hsp
同じくモジュール変数使用版
map2.12_for_hsp3 .hsp
ハッシュコード(ハッシュ値)と言われる要約値をを求める要約関数のことをハッシュ関数といいます。
通常、一方向要約関数です。つまり文字列からハッシュコードは求められるが、
ハッシュコードからは元の文字列を求めることは出来ません。
このハッシュコード、ハッシュ関数は様々なところで利用されています。
ハッシュ関数には様々な実装があります。有名なものとしてはMD5などがあり、認証やデジタル署名などにも利用されます。
MD5は非常に高機能で、似たような文章であっても一文字違うだけで、まったく異なるコードを返します。
今回は、わかりやすい簡単な実装を考えてみます。
辞書のインデックスをイメージしてください。
国語辞典なら「あいうえお・・・・」
英語辞典なら「abcdefg・・・・」
漢字字典なら「1画、2画、3画・・・」
などのインデックスです。
同様に、文字列の最初の一文字がA〜Zのでどれかでハッシングするハッシュ関数の実装を考えます。
例
「Hot」⇒h 「Soup」⇒s 「Processor」⇒p
が求まる実装です。
上記の例では、文字列がアルファベットのみの場合、26種類のハッシュコードを求めるのに固定されてしまいます。
また、先頭文字に同じ文字を利用する場合などに機能しません。
そこでピット演算を利用した簡単で、実用的な実装を考えてみたいと思います。
さて本題です。通常、連想配列はハッシュ関数を利用したハッシュテーブルとして実装されます。
これはパフォーマンスを向上させます。これによりしばしば通常の配列ではなく連想配列を利用する要因となります。
ハッシュテーブルとはハッシュコードごとに、「簡単な実装」で作成したような配列を管理するのです。
「ハッシュ関数の実装1」で実装したハッシュ関数を利用した場合、まさに辞書と同じ体系でデータを管理することになります。
この為、全体を検索するより効率的にデータを検索できる訳です。
HSP2.61では動的配列の拡張は出来ません。
その為、26個のハッシュコードに対し、10個づづの配列を作成したとしても、260個の変数を作成することになります。
これは運がよければ260個の変数を格納できますが、運が悪いと11個の変数を格納した時点でエラーとなってしまいます。
回避する方法としては、10個が埋まった時点で、10個を別の配列に退避し、再度、20個ノ配列を確保するなど、自前で配列を拡張することになります。
動的配列の拡張が出来ないHSP向けに同じところに同じハッシュコードを持つデータが集まる実装。