以下代码来自https://gist.github.com/bonsaiviking/5639034
是一个sha1哈希代码,但我想能够输入一个文本消息,它哈希。我只是不知道消息应该输入到哪里(哪个变量),或者我是否需要根据需要首先调用函数。我对python类有点不熟悉。我理解代码在做什么,但是它的self
部分让我困惑。我已经阅读了关于类和pythonself
的内容,但仍然对它感到困惑。你知道吗
有人可以请指导我在正确的方向上如何输入一个信息要散列在下面的代码。谢谢
#!/usr/bin/env python
import struct
def leftrotate(i, n):
return ((i << n) & 0xffffffff) | (i >> (32 - n))
class SHA1(object):
def __init__(self, data=""):
self.h = [
0x67452301,
0xEFCDAB89,
0x98BADCFE,
0x10325476,
0xC3D2E1F0
]
self.remainder = data
self.count = 0
def _add_chunk(self, chunk):
self.count += 1
w = list( struct.unpack(">16I", chunk) + (None,) * (80-16) )
for i in xrange(16, 80):
n = w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]
w[i] = leftrotate(n, 1)
a,b,c,d,e = self.h
for i in xrange(80):
f = None
k = None
if i < 20:
f = (b & c) ^ (~b & d)
k = 0x5A827999
elif i < 40:
f = b ^ c ^ d
k = 0x6ED9EBA1
elif i < 60:
f = (b & c) ^ (b & d) ^ (c & d)
k = 0x8F1BBCDC
else:
f = b ^ c ^ d
k = 0xCA62C1D6
temp = (leftrotate(a,5) + f + e + k + w[i]) % 2**32
e = d
d = c
c = leftrotate(b, 30)
b = a
a = temp
self.h[0] = (self.h[0] + a) % 2**32
self.h[1] = (self.h[1] + b) % 2**32
self.h[2] = (self.h[2] + c) % 2**32
self.h[3] = (self.h[3] + d) % 2**32
self.h[4] = (self.h[4] + e) % 2**32
def add(self, data):
message = self.remainder + data
r = len(message) % 64
if r != 0:
self.remainder = message[-r:]
else:
self.remainder = ""
for chunk in xrange(0, len(message)-r, 64):
self._add_chunk(message[chunk:chunk+64])
return self
def finish(self):
l = len(self.remainder) + 64 * self.count
self.add( "\x80" + "\x00" * ((55 - l) % 64) + struct.pack(">Q", l * 8) )
h = tuple(x for x in self.h)
self.__init__()
return struct.pack(">5I", *h)
你不需要关心
self
,除非你在类中编写代码。使用SHA1类与或者,要使用
.add
函数:详细说明
self
:在类中定义的函数需要该类的实例来操作。这个实例作为第一个参数传递给函数,通常称为self
。(如果您熟悉其他编程语言,self
是this
的python等价物。)如果您将函数调用为instance.function()
(例如sha.finish()
),则self
参数会自动传递,因此它几乎不存在。如果你正在为一个类编写函数,你只需要关心它。你知道吗如果你看test.py:
我猜sha1.py中的
data
可能就是输入。你知道吗注意这个功能。我想这里的按摩很顺利。这不是你的问题吗?你知道吗
关于你的第二个问题,是的,你需要调用你需要的函数或者只是一般函数。你知道吗
在这段代码之后你可以调用add(1,2)函数put veriables我希望它能工作
我认为另一个问题是你的定义不在类中,所以当你调用类时,它不会给你结果。试着把def放在课堂上,如果有用就告诉我
相关问题 更多 >
编程相关推荐