Python MemoryError正在尝试哈希字符串

Python MemoryError正在尝试哈希字符串,python,out-of-memory,Python,Out Of Memory,我正在开发一个用python对输入字符串进行哈希处理的程序,但我无法运行它。当我尝试将字符串的两个部分相加时,我的记忆会出现错误 文件“C:/Users/jack/PycharmProjects/Hashbrown/Hashbrown.py”,第43行,在 打印(散列输出(输入(“散列输入:”)) 文件“C:/Users/jack/PycharmProjects/Hashbrown/Hashbrown.py”,第8行,散列 out=out+hash(x,0) 文件“C:/Users/jack/P

我正在开发一个用python对输入字符串进行哈希处理的程序,但我无法运行它。当我尝试将字符串的两个部分相加时,我的记忆会出现错误

文件“C:/Users/jack/PycharmProjects/Hashbrown/Hashbrown.py”,第43行,在
打印(散列输出(输入(“散列输入:”))
文件“C:/Users/jack/PycharmProjects/Hashbrown/Hashbrown.py”,第8行,散列
out=out+hash(x,0)
文件“C:/Users/jack/PycharmProjects/Hashbrown/Hashbrown.py”,第38行,散列格式
混乱=第二部分+第一部分
记忆者
这是我的代码,我试图通过各种转换对输入字符串进行编码,并输出散列字符串:

导入数学
进口箱
def散列(输入):
inputmod=input.replace(“,“spc”)。replace(“y”,“55ut”)
listofchars=[inputmod中的字符对应字符]
out=“”
对于列表中的x:
out=out+hash(x,0)
返回(输出)
def散列(输入、len_输出):
inputlength=1
n1=int(输入,32)
n2=四舍五入(n1*输入长度)**数学sqrt(((输入长度*n1)**数学pi)*1537437/100000000000000)
n3=n2输入长度
n4=n3+输入长度+n1
s1=str(n4)
s2=s1[:-1]
s3=s2。替换(“e”和“”)
s3=s3。替换(“+”,“”)。替换(“.”,“”)
l1=列表(s3)
n5=int(l1[0])
n6=n5*int(s3)/10000
n7=(第六轮)
s99999=str(n7)
n=2
行=s99999
fakeascii=[line[i:i+n]表示范围内的i(0,len(line),n)]
res=“”
对于假ASCII格式的val:
res=res+chr(int(val))
asciiout=str(res)
test_str=asciiout.replace(“,“sp”)
bindat=''.join(格式(ord(i),'b')表示测试中的i)
s=(str(bindat*100000000))[:-1]
前半部分=s[0:len(s)//2]
后半部分=s[len(s)//2如果len(s)%2==0其他((len(s)//2)+1):]
混乱=第二部分+第一部分
#out=binstr.bintostr(混乱)
杂乱无章
返回(输出)
尽管如此:
打印(散列输出(输入(“散列输入:”))
这是binstr图书馆:

def BinaryToDecimal(二进制):
二进制1=二进制
十进制,i,n=0,0,0
而(二进制!=0):
dec=二进制%10
十进制=十进制+十进制*功率(2,i)
二进制=二进制//10
i+=1
返回(十进制)
def bintostr(bin_数据):
str_数据=“”
对于范围内的i(0,len(bin_数据),7):
温度数据=int(bin数据[i:i+7])
十进制数据=二进制到十进制(临时数据)
str_数据=str_数据+chr(十进制数据)
返回(str_数据)

代码写得很糟糕,但主要问题是:

bindat=''.join(format(ord(i), 'b') for i in test_str)
s=(str(bindat*100000000))[::-1]
将bindat设置为字符串,然后尝试将其作为整数进行乘法,简单的替代是:

bindat=''.join(format(ord(i), 'b') for i in test_str)
s=(str(int(bindat)*100000000))[::-1]
因此,您不会在任何地方使用binstr库,其中有一行注释,但根本没有使用。代码本身非常不理想,您经常将可以在一行中完成的事情拆分为多行,例如:

n1 = int(input,32)
n2 = round(n1*inputlength)**math.sqrt(((inputlength*n1)**math.pi)*1537437/10000000000000000000000)
n3 = n2-inputlength #why do this at all?
n4 = n3+inputlength + n1 #when you negate it here?
可以简化为:

n1 = int(input,32)
n2 = round(n1*inputlength)**math.sqrt(((inputlength*n1)**math.pi)*1537437/10000000000000000000000) + n1
也许你也可以把这些数字作为变量来添加,以使代码更清晰

您也可以经常执行分配变量的步骤,但没有原因或用途,例如
binary1=binary
in
bintostr
而不进一步使用变量
binary1
out=jumbled
,然后只返回此变量。您应该避免使用此类代码,以提高可读性和性能。因此,我建议你退房。它可能会帮助您编写更好的代码:)