;;;; entropy-clock.scm ;;;; Kon Lovett, Oct '09 (module entropy-clock (;export make-entropy-source-system-clock) (import scheme chicken foreign entropy-source entropy-support) (require-library 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 ); } #undef MODULO <# (define f64init (foreign-lambda double "f64init")) (define f64rand (foreign-lambda double "f64rand" double)) ;;; Entropy from system clock (define (make-entropy-source-system-clock) (let ((f64seed (f64init))) (let ((_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