Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yiwu-arbug/b09831e55a960a435fc37623c24ba234 to your computer and use it in GitHub Desktop.
Save yiwu-arbug/b09831e55a960a435fc37623c24ba234 to your computer and use it in GitHub Desktop.
calculate bits per key per level using Monkey
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