在很多场合的时候,我们都需要产生不重复的字符串来标志操作的唯一性,比如:HTTP请求中,我们需要产生SessionID,在数据存储的时候,我们也可能需要生成唯一的字符串来作为数据的ID以便我们进行索引。本文的由来是在使用tornado的时候,需要使用Session,Session需要有唯一的ID值。为了尽可能快速的生成安全可用的Session ID,而对Python当前的一些比较通用的生成方法进行了比较。为了方便说明,后继的所有说法均以token作为SessionID, 唯一字串等的统一表述。
在网络中比较流行的是使用uuid4().hex的方式来生成token,但另外一种声音是,uuid4().hex的安全性不高,需要使用安全性更高的算法来代替,后继出现了使用os.urandom(24),或者自行随机生成字符串的形式(uuid4使用的是os.urandom(16)),再到后来,使用OpenSSL和M2Crypto的方式来生成随机数。OpenSSL和M2Crypto需要Python安装pyOpenSSL和M2Crypto。M2Crypto由于接触少,因此没有对M2Crypto进行测试。
测试环境:
CPU: Intel Xeon E3 3.30Hz 3.70Hz
Memory: 16GB
System: Windows 7 64-bits
# times:测试次数
# func: 要测试的函数名称
# 此方法是入口方法
# 各个算法以函数的形式定义,接受times参数即可——By MitchellChu
def crash_testx(times, func):
import time
print('\r\n--------------------------------------------')
print("test function: %s" % func.func_name)
print("begin time: %s" % time.strftime('%Y%m%d %X'))
begin_time = time.time()
(crashed_times, hash_data_len) = func(times)
print("end time: %s" % time.strftime('%Y%m%d %X'))
print("take time:%s" % (time.time() - begin_time))
print("test times: %d, crashed times:%d, hash data length:%d" % (times, crashed_times, hash_data_len))
print('--------------------------------------------\r\n')
产生方式(generate method)
...