gpt4 book ai didi

c++ - 以小于一毫秒的精度计算时间的函数

转载 作者:行者123 更新时间:2023-11-30 05:11:27 34 4
gpt4 key购买 nike

我这里有一个函数可以使程序计数、等待等最少计数为 1 毫秒。但我想知道我是否可以做同样的事情会降低精度。我读过其他答案,但它们主要是关于 changing to linux or sleep is guesstimate更重要的是,这些答案已有大约十年的历史,所以可能会有新的功能来做这件事。

这是函数-

void sleep(unsigned int mseconds)
{
clock_t goal = mseconds + clock();
while (goal > clock());
}

实际上,我试图制作一个类似于 secure_compare 的函数但我认为仅仅比较两个字符串就浪费 1 毫秒(当前最少计数)是不明智的。

这是我做的相同的功能-

bool secure_compare(string a,string b){
clock_t limit=wait + clock(); //limit of time program can take to compare
bool x = (a==b);

if(clock()>limit){ //if time taken to compare is more increase wait so it takes this new max time for other comparisons too
wait = clock()-limit;
cout<<"Error";
secure_compare(a,b);
}

while(clock()<limit); //finishing time left to make it constant time function
return x;
}

最佳答案

您正在尝试使比较函数与时间无关。基本上有两种方法可以做到这一点:

  • 测量通话时间并睡适当的时间
    这可能只会将一个侧 channel (定时)换成另一个侧 channel (功耗,因为 sleep 和计算可能具有不同的功耗特性)。
  • 使控制流更加独立于数据:

除了使用普通的字符串比较,您还可以实现自己的比较,比较所有 个字符,而不仅仅是直到第一次不匹配为止,如下所示:

bool match = true;
size_t min_length = min(a.size(), b.size());
for (size_t i = 0; i < min_length; ++i) {
match &= (a[i] == b[i]);
}
return match;

在这里,没有发生分支(条件操作),因此每次使用相同长度的字符串调用此方法应该花费大致相同的时间。因此,您泄漏的唯一边信道信息是您比较的字符串的长度,但如果它们是任意长度,无论如何都很难隐藏。

编辑:合并路人评论:

如果我们想减少大小泄漏,我们可以尝试将大小四舍五入并限制索引值。

bool match = true;
size_t min_length = min(a.size(), b.size());
size_t rounded_length = (min_length + 1023) / 1024 * 1024;
for (size_t i = 0; i < rounded_length; ++i) {
size_t clamped_i = min(i, min_length - 1);
match &= (a[clamped_i] == b[clamped_i]);
}
return match;

可能存在微小的缓存时序侧信道(因为如果 i > clamped_i,我们不会再有缓存未命中),但是因为 a b 无论如何都应该在缓存层次结构中,我怀疑这种差异是否可以以任何方式使用。

关于c++ - 以小于一毫秒的精度计算时间的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45009026/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com