有人可以解释这段代码中究竟发生了什么,所以我可以用python编写它。 我需要遵循完全相同的c书面规范,所以稍后这部分将在python bloom过滤器中实现Bep33 bit torrent DHT
//fixed parameters
k = 2
m = 256*8
//the filter
byte[m/8] bloom ##
function insertIP(byte[] ip) {
byte[20] hash = sha1(ip)
int index1 = hash[0] | hash[1] << 8 # how to in python?
int index2 = hash[2] | hash[3] << 8
// truncate index to m (11 bits required)
index1 %= m ## ?
index2 %= m ## ?
// set bits at index1 and index2
bloom[index1 / 8] |= 0x01 << index1 % 8 ## ??
bloom[index2 / 8] |= 0x01 << index2 % 8 ## ??
}
// insert IP 192.168.1.1 into the filter:
insertIP(byte[4] {192,168,1,1})
我正在尝试将其转换为python,请参阅下面的评论
import hashlib
import socket
import struct
class blommy(object):
def __init__(self):
self.bitarray= [0]*2048
def hashes(self,ip):
#convert decimal dotted quad string to long integer"
intip= struct.unpack('>L',socket.inet_aton(ip))[0] #>converting stringt to int
index = [0, 1]
hbyte = hashlib.sha1(intip) # # #sha1 doesnt accept int ? what needs to be done?
index[0] = ord(hbyte[0])| ord(hbyte[1])<< 8
index[1] = ord(hbyte[2])| ord(hbyte[3])<< 8
# how do i shift the bits?
答案 0 :(得分:2)
sha1在Python 2.x中接受普通字符串。您可能需要直接从socket.inet_aton(ip)获取单个字节(不确定订单是否适合您的算法)
至于位移,我认为Python具有相同的语法,但如果对执行顺序有疑问,可能需要添加括号。
此外,C char可以作为int,但在Python中,您需要始终使用ord()和chr()函数显式转换它们。
即使像%=
和|=
这样的内容也适用于Python。