עבודה עם /dev/random ו /dev/urandom

ישנם בעולם ה POSIX – בעיקר במערכות יוניקס 2 devices אשר מאפשרים לנו לקבל מספר כלשהו שיהיה בסיס לחישוב רנדומאלי (seed). ההבדל העיקרי בניהם הוא ש random הוא blocking, כלומר עד אשר לא אקבל תשובה אשאר "תקוע". בעוד ש urandom חוזר מייד, ולפעמים יביא מידע פחות איכותי (כלומר פחות רנדומאלי) לשימוש.

הפוסט הזה מדגים במספר שפות תכנות כיצד אפשר להשתמש ב2 ברכיבים האלו. הקוד מפורסם תחת MIT.
שפת C:

#include <stdio.h>
unsigned int get_urandom() {
   unsigned int seed;
   FILE * dev;

   dev = fopen ("/dev/urandom", "r");
   if (dev == NULL) {
     return 0;
   }
   setbuf(dev,0);
   fread(&seed, sizeof(seed), 1 , dev);
   fclose(dev);
   return seed;
}

שפת Perl

sub get_urandom() {
  my $dev;
  open($dev, '<', '/dev/urandom') || return 0;
  my $seed;
  read($dev, $seed, 8);
  close($dev);
  return unpack('L', $seed);
}

שפת Ruby

def get_urandom
  result = open('/dev/urandom').read(8);
  result.unpack('L').first
rescue
  0
end

שפת Object Pascal:

function get_urandom : longint;
var
 f : file of longint;
begin
  filemode := 0; // binary mode
  AssignFile(f, '/dev/urandom');
  {$I-}
  reset (f,1);
  {$I+}
  if IOResult <> 0 then Exit(0);
  read (f,result);
  CloseFile (f);
end;

את המידע שקיבלתם תהיו צריכים לעביר ל srand או משהו בסגנון אשר מקבל בעצם את הseed, שלאחריהם אפשר להתשמש ב פקודת ה random בשפה שלכם בהצלחה.

5 מחשבות על “עבודה עם /dev/random ו /dev/urandom

  1. ארתיום

    הערה קטנה אבל מאוד מאוד חשובה:

    fopen ("/dev/urandom", "r"); ולאחר מכן fread ירגום לבזבוז CPU עצום, כי כברירת מחדל יתבצע buffering ובפועל ייקרו כ-4K בתים. אתה תראה את זה אם תריץ strace…

    כדאי לקרוא ל-setbuf(dev,0) כדי למנוע שימוש ב-buffer.

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s