BookmarkSubscribeRSS Feed
Hagay
SAS Employee

לעיתים אנחנו נתקלים בצורך לזהות באופן חד-חד ערכי מידע כלשהו. למשל אנחנו מעוניינים לקרוא קובץ נתונים עם מספר שדות ולעדכן טבלה במידה ובקובץ מופיעה רשומה חדשה שלא קיימת בטבלה. הדרך התמימה לבצע את המשימה הזו היא לבדוק בעת העדכון שדה-שדה ולראות האם יש לנו ביד רשומה חדשה. זה עובד מצוין אם יש לנו שלוש-ארבע שדות אבל מהר מאוד זה נהיה מתיש ולא יעיל.

 

פתרון אפשרי לבעיה הזאת הוא שימוש בפונקציית גיבוב. מהו גיבוב אתם שואלים? ובכן גיבוב, hashing באנגלית, הוא מונח במדעי המחשב להמרה של מידע (מחרוזת) לקוד מסוים באורך קבוע אשר מזהה באופן ייחודי את המידע המקורי שלנו. שום מחרוזת אחרת בעולם לא תיתן לנו את אותו ערך מגובב פרט למידע המקורי שלנו (למעשה במרבית האלגוריתמים, ניתן לקבל אותו ערך מגובב עבור מידע שונה אבל הסיכוי לכך הוא קטן שבקטנים כך שלרוב אנחנו יכולים לחיות איתו עבור רוב השימושים).

 

אחד מאלגוריתמי הגיבוב הוותיקים והמוכרים הוא MD5. גם SAS כוללת פונקציה אשר מקבלת מחרוזת כלשהי ומחזירה לנו את התוצר של אלגוריתם ה – MD5 שהוא תמיד באורך של 128 ביטים, 16 בייטים ולפונקציה קוראים, תחזיקו חזק, MD5.

 

איך זה עוזר לנו במקרה שתיארנו לעיל? כאשר קוראים קובץ ב – data step יש משתנה נסתר בשם _infile_ אשר מכיל את כל השורה שאנחנו קוראים הרגע, אם נגבב את המחרוזת הזאת נקבל מזהה ייחודי של כל השדות ברשומה הנוכחית בקובץ שלנו. כל שינוי קטן באחד מהשדות יוביל לקבלת מחרוזת MD5 שונה לחלוטין. הדרך מכאן ברורה, אנחנו נשמור בטבלה המצטברת שלנו את מחרוזות הגיבוב ומספיק להשוות את הערך של הרשומה הנוכחית לשדה הזה בטבלה שלנו בלי קשר לכמות השדות הנוספים שקיימים בטבלה כדי לראות אם מדובר בנתונים חדשים או בכאלו שכבר הטענו בעבר.

 

אכלנו את הראש מספיק. זמן לדוגמא:

* Creating a samle file to use in our example;
proc export data=SASHELP.CLASS outfile="%sysfunc(pathname(work))\class.csv" dbms=csv replace;
run;

data MY_CLASS;
	length 
		Name	$8
		Gender	$1
		Age
		Height
		Weight	8
		MD5		$32;
	infile "%sysfunc(pathname(work))\class.csv" dsd delimiter="," firstobs=2;
	input name gender age height weight;
	md5=put(md5(_infile_), $hex32.); * The MD5 function returns binary data. We convert the 128 bits we get to a string using the hexadecimal representation;
run;

חשוב מאוד לזכור שפונקציה MD5 איננה הצפנה. אומנם ההמרה היא חד כיוונית (ממחרוזת MD5 לא ניתן לייצר מחדש את הטקסט המקורי) אבל ניתן יחסית בקלות לבדוק כמות עצומה של מחרוזות ולראות האם במקרה אחת מהן נותנת את ה – MD5 שאנחנו רוצים להגיע אליו. אין להשתמש באלגוריתם הזה לשמירת סיסמאות למשל או כל מידע רגיש אחר.

 

חגי

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

Discussion stats
  • 0 replies
  • 296 views
  • 1 like
  • 1 in conversation