This removes the packbytes function, and replaces randlong with randhexstr which uses the binascii.hexlify function instead. Taking a string from dev/urandom converting it to a long integer and then back to a string via "%016X" % seemed longwinded to me. The main benefit is probably code deletion. If the hexstring returned from randhexstr absolutely needs to be uppercase, then the call randhexstr(8).upper() should satisfy that. Jon Index: session.py =================================================================== RCS file: /home/cvs/quixote/session.py,v retrieving revision 1.58 diff -c -r1.58 session.py *** session.py 18 Oct 2002 21:16:23 -0000 1.58 --- session.py 20 Oct 2002 14:40:28 -0000 *************** *** 23,60 **** import sys, string from time import time, localtime, strftime, clock from quixote import get_publisher from quixote.errors import SessionError - def packbytes(s): - "convert a string of bytes into a long integer" - n = 0L - for b in s: - n <<= 8 - n |= ord(b) - return n - try: # /dev/urandom is just as good as /dev/random for cookies (assuming # SHA-1 is secure) and it never blocks. open("/dev/urandom") ! def randlong(bytes): ! """Return bits of random data as a long integer.""" ! return packbytes(open("/dev/urandom").read(bytes)) except IOError: # this is much less secure than the above function import sha _randstate = sha.new(str(time() + clock())) ! def randlong(bytes): ! """Return bits of random data as a long integer.""" global _randstate s = "" while len(s) < bytes: _randstate.update(str(time() + clock())) s += _randstate.digest() ! return packbytes(s[:bytes]) class SessionManager: --- 23,53 ---- import sys, string from time import time, localtime, strftime, clock + from binascii import hexlify from quixote import get_publisher from quixote.errors import SessionError try: # /dev/urandom is just as good as /dev/random for cookies (assuming # SHA-1 is secure) and it never blocks. open("/dev/urandom") ! def randhexstr(bytes): ! """Return bits of random data as hex string of bytes.""" ! return hexlify(open("/dev/urandom").read(bytes)) except IOError: # this is much less secure than the above function import sha _randstate = sha.new(str(time() + clock())) ! def randhexstr(bytes): ! """Return bits of random data as a hex string of bytes.""" global _randstate s = "" while len(s) < bytes: _randstate.update(str(time() + clock())) s += _randstate.digest() ! return hexlify(s[:bytes]) class SessionManager: *************** *** 255,261 **** # used with the session manager mapping interface.) id = None while id is None or self.has_session(id): ! id = "%016X" % randlong(8) # 64-bit random number return id def _create_session (self, request): --- 248,254 ---- # used with the session manager mapping interface.) id = None while id is None or self.has_session(id): ! id = randhexstr(8) # 64-bit random number return id def _create_session (self, request):