Python 如何生成用于查找具有9个前导零的哈希的计数器
我正在尝试创建一个函数,该函数将使用带有9个前导零的sha1算法生成哈希。散列是基于一些随机数据的,就像在并发挖掘中一样,我只想在散列函数中使用的字符串中添加1 为了更快,我使用Pool类中的map()使它在我的所有内核上运行,但是如果我传递的块大于范围(9999999),则会出现问题 我想创建一个类似于全局计数器的东西,以便在函数运行多线程时将其输入函数,但如果我尝试range(sys.maxsize),我会得到一个MemoryError(我知道,因为我没有足够的RAM,很少有),但我想将range()生成的列表拆分为块。Python 如何生成用于查找具有9个前导零的哈希的计数器,python,multithreading,hash,mining,Python,Multithreading,Hash,Mining,我正在尝试创建一个函数,该函数将使用带有9个前导零的sha1算法生成哈希。散列是基于一些随机数据的,就像在并发挖掘中一样,我只想在散列函数中使用的字符串中添加1 为了更快,我使用Pool类中的map()使它在我的所有内核上运行,但是如果我传递的块大于范围(9999999),则会出现问题 我想创建一个类似于全局计数器的东西,以便在函数运行多线程时将其输入函数,但如果我尝试range(sys.maxsize),我会得到一个MemoryError(我知道,因为我没有足够的RAM,很少有),但我想将ra
这是可能的还是我应该尝试另一种方法?您好,欢迎来到stackoverflow 首先,是的,可以使用全局计数器。例如,使用传递给工人的a或a。但是,从全局计数器获取新的数字将导致锁定(并可能等待)计数器。这可以而且应该避免,因为您需要进行大量的反查询。下面我建议的解决方案通过安装几个本地计数器来避免全局计数器,这些计数器就像单个全局计数器一样协同工作 关于代码的RAM消耗,我发现两个问题:
computesha
在大多数情况下返回一个None
值。这将进入由map
创建的迭代器(即使您没有指定map
的返回值)。这意味着迭代器比需要的大得多maxstasksperchild
选项(请参阅的文档)。当您将此选项设置为1000时,它会在完成1000个任务后关闭进程并创建一个新的进程,从而释放内存但是,我想提出一个解决这两个问题的不同的解决方案,它对内存非常友好,运行速度更快(就像我在NGreat之后),然后考虑到<代码>接受< /代码>这个答案,@ aligabiRelaMy.
def computesha(counter):
hash = 'somedata'+'otherdata'+str(counter)
newHash = hashlib.sha1(hash.encode()).hexdigest()
if newHash[:9] == '000000000':
print(str(newHash))
print(str(counter))
return str(newHash), str(counter)
if __name__ == '__main__':
d1 = datetime.datetime.now()
print("Start timestamp" + str(d1))
manager = multiprocessing.Manager()
return_dict = manager.dict()
p = Pool()
p.map(computesha, range(sys.maxsize) )
print(return_dict)
p.close()
p.join()
d2 = datetime.datetime.now()
print("End timestamp " + str(d2))
print("Elapsed time: " + str((d2-d1)))