Created
July 19, 2019 19:04
-
-
Save yiwu-arbug/b09831e55a960a435fc37623c24ba234 to your computer and use it in GitHub Desktop.
calculate bits per key per level using Monkey
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import math | |
from openpyxl import workbook # 写入Excel表所用 | |
from openpyxl import load_workbook # 读取Excel表所用 | |
# amplification factor | |
T = 10 | |
# calculate the total false positive rate when bits per key is determinsed | |
def overall_fpr(bits): | |
return math.pow(T, T / (T - 1)) / (T - 1) * math.exp(-1 * bits * math.log(2) * math.log(2)) | |
# calculate the target level's false positive rate when the total false positive rate and total levels is determinsed | |
def fpr_level(total_fpr, total_levels, level): | |
return total_fpr / math.pow(T, total_levels - level) * math.pow(T, total_levels - 1) / (math.pow(T, total_levels) - 1) * (T - 1) | |
# convert the false positive rate to bits per key | |
def fpr_to_bits(fpr): | |
return int(math.log(fpr) / math.log(0.6185)) | |
# return the level config | |
def bits_per_level(total_level,bits_per_key): | |
fpr = overall_fpr(bits_per_key) | |
bits_per_level = [] | |
for i in range(1, total_level+1): | |
bits_level = fpr_to_bits(fpr_level(fpr, total_level, i)) | |
print("level %d use %d bits-per-key" % (i - 1, bits_level)) | |
bits_per_level.append(bits_level) | |
return bits_per_level | |
if __name__ == "__main__": | |
# config | |
output_path="monkey-config.xlsx" | |
bits_per_key_list = [5,10] | |
level_min = 3 | |
level_max = 7 | |
global_wb=workbook.Workbook() | |
global_ws=global_wb.active | |
for bits_per_key in bits_per_key_list: | |
global_ws.append(['bits per key = '+ str(bits_per_key)]) | |
global_ws.append(['','level0','level1','level2','level3','level4','level5','level6']) | |
for i in range(level_min,level_max + 1): | |
print("total level %d,bits per key : %d"%(i,bits_per_key)) | |
tmp_row = [] | |
tmp_row.append('total-level='+str(i)) | |
tmp_row.extend(bits_per_level(i,bits_per_key)) | |
global_ws.append(tmp_row) | |
global_wb.save(output_path) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment