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

Function to count time with precision less than a millisecond

我这里有一个函数可以使程序计数、等待等最少计数为 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;
}

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

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

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

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 我们不会再有任何缓存未命中),但由于 ab 应该在无论如何,缓存层次结构,我怀疑差异是否可用。