;;;; entropy-clock.scm ;;;; Kon Lovett, Oct '09 (module entropy-clock (;export make-entropy-source-system-clock) (import scheme chicken foreign) (use entropy-source entropy-support) ;;; #| #> #include #include static double f64init() { return (double) time( NULL ); } static double f64rand( double f64seed ) { double x = 11.0 + (25214903917.0 * f64seed); return fmod( x, 281474976711000.0 ); /* actually remainder */ } <# (define f64init (foreign-lambda double "f64init")) (define f64rand (foreign-lambda double "f64rand" double)) |# (import extras) (define (f64init) (randomize)) (define (f64rand n) (random n)) ;;; Entropy from system clock (define (make-entropy-source-system-clock) (let* ((f64seed (f64init)) (_f64rand (lambda () (set! f64seed (f64rand f64seed)) f64seed)) ) (*make-entropy-source ; make-entropy-source-system-clock ; 'system-clock ; "Entropy from system clock" ; (make-entropic-u8/f64 _f64rand) ; _f64rand ; (lambda (u8cnt u8vec) (entropic-u8vector-filled/f64 u8cnt u8vec _f64rand) ) ; (lambda (f64cnt f64vec) (entropic-f64vector-filled f64cnt f64vec _f64rand) ) ) ) ) (register-entropy-source! 'system-clock make-entropy-source-system-clock) ) ;module entropy-clock