データセットの内容が、あるプログラムの処理前と処理後で同一であるかを確認する方法は色々考えることができます。まあ基本compareプロシジャ使えばいいんですけど。
今回はハッシュ値関数を使った話です。
ハッシュオブジェクトの話ではないので、ハッシュオブジェクトに興味ない方でも問題ないです。
ハッシュ値関数とは、ざっくりいうと、ある文字列を与えた時にその文字列から数値を生成してくれるものです。
基本的に暗号化に使われている技術です。ハッシュ値関数による改竄検知の仕組みとはつまり、元のデータセットの内容をハッシュ値関数にかけてハッシュ値をつくります。
そして、まあ何か処理やデータの移動があったとして、再度ハッシュ値関数にかけてハッシュ値をつくってそれが最初のハッシュ値と一致してればOKということです。
で、どういうアルゴリズムでハッシュ値を生成するかというのは、とても難しい問題です。
何せ、暗号化に使われている技術なので、簡単に復号できたらいけないわけで、日進月歩で進歩しているわけです。
でSASにはMD5関数というものがあったのですが、9.4から、さらに頑健なSHA256関数というものが実装されたそうです。
ただ9.4の実行環境がないので MD5で説明します。
9.4環境の人はどうせならSHA256使った方がいいでしょう。
data Q0;
A='い';B='は';C='ろ';D='に';output;
A='い';B='は';C='に';D='に';output;
A='は';B='ろ';C='ろ';D='に';output;
A='に';B='ろ';C='ろ';D='は';output;
A='い';B='は';C='ろ';D='に';output;
run;
というものが与えれたら、まず全変数の値を連結した値をもとにして
ハッシュ値を生成してみます。
data Q1;
set Q0;
H1=md5(cats(of A--D));
format H1 hex32.;
run;
となります。
hex32.フォーマットを当てないと表示が文字化けします。
1オブザベーション目と5オブザベーション目は、実は同じ内容なのですが、ちゃんと
H1の値が同じであることがわかります。
で、今回は3obsベーション目の内容を変えて、再度ハッシュ値を生成して比較してみます。
data Q2;
set Q1;
if _N_=3 then D='は';
H2=md5(cats(of A--D));
if H1^=H2 then FL='×';
else FL='○';
format H2 hex32.;
run;
となって、ちゃんと3オブザベーション目のハッシュ値だけ変わっていることが確認できます。
さて、これの応用の仕方はそれぞれです。
長いテキスト内容そのものや、複数変数の内容をキーにしなければならない時などに、そこから生成したハッシュ値を代理キーにすることで、処理効率や保守性があがることもあるでしょう。
また、他の人にデータセットを送って、それが送り返されてきた際に同一かどうかを確認するのに使うのもよいでしょう。
また変更箇所にもとづいた条件分岐を1つのデータステップでやりたい場合などにも、1回コンペアプロシジャ回してから処理に入るよりスムーズな場合もあるでしょう。
0 件のコメント:
コメントを投稿