使用循环查找散列对象中的前d个零的数量

时间:2018-05-17 02:46:11

标签: python python-3.x

我需要确定安全级别" d"通过使用SHA256计算哈希字符串中第一个d 0的数量(我定义了 c_hash(mystring,sha256)来做)。 我使用 generate_name 函数生成一个随机的名字,其中包含3-6个字母和4-8个字母的姓氏。这是我的代码:

def d_security(d):
   t0 = time.clock()
   cnt = 0
   while cnt != d:
       obj = generate_name()
       hash_obj = c_hash(obj,sha256)
       if hash_obj[:d] == d*"0":
           cnt+=1
   t1 = time.clock()
   print(t1-t0)
   return None

对于d = 5,需要2分钟才能找到与安全级别匹配的字符串。关于如何使用另一个循环更快地运行的任何建议?

2 个答案:

答案 0 :(得分:0)

  1. d*"0"每次都在重新计算,尽管是不变的。也许计算它并在while循环帮助之前将其分配给另一个变量。

  2. 如果你的代码运行缓慢,那主要不是因为循环。生成名称和哈希应占用大部分运行时间。所以:

    2a上。生成较短的名称,或

    2B。如果has函数允许,请重新设计哈希生成器c_hash以仅返回哈希值的前d个数字。毕竟你只需要那些数字,计算整个哈希值需要时间。

答案 1 :(得分:0)

评估d *" 0"将它放在函数的顶部只有一次。 此外,使用startswith而不是使用切片。有效地给你:

def d_security(d):
   expected = d*"0"
   t0 = time.clock()
   cnt = 0
   while cnt != d:
       obj = generate_name()
       hash_obj = c_hash(obj,sha256)
       if hash_obj.startswith(expected):
           cnt+=1
   t1 = time.clock()
   print(t1-t0)