我的代码遇到了瓶颈,所以这个问题的主要问题是性能。
我有一个十六进制校验和,我想检查一个字符数组的前导零。这就是我正在做的:
bool starts_with (char* cksum_hex, int n_zero) {
bool flag {true};
for (int i=0; i<n_zero; ++i)
flag &= (cksum_hex[i]=='0');
return flag;
}
Run Code Online (Sandbox Code Playgroud)
如果cksum_hex有,则上述函数返回truen_zero前导零,。但是,对于我的应用程序,此功能非常昂贵(占总时间的 60%)。换句话说,它是我代码的瓶颈。所以我需要改进它。
我还检查了std::string::starts_with哪些在 C++20 中可用,我发现性能没有差异:
// I have to convert cksum to string
std::string cksum_hex_s (cksum_hex);
cksum_hex_s.starts_with("000"); // checking for 3 leading zeros
Run Code Online (Sandbox Code Playgroud)
有关我正在使用的更多信息 g++ -O3 -std=c++2a,我的 gcc 版本是 9.3.1。
std::string::starts_with?我想创建到服务器的 TLS 连接。然后,我想发送一些加密的数据到服务器。我知道主机名和端口并且有证书。令人惊讶的是,我还收到了服务器的私钥。但是,我认为我收到私钥是不正常的。
第一个问题是,我真的需要私钥来建立 TLS 连接吗?
顺便说一句,我正在使用这个 python 脚本
import socket
import ssl
server_addr = '**.**.**.**'
server_port = ****
server_cert = 'server.crt'
server_key = 'server.key' # I use the private key
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.verify_mode = ssl.CERT_REQUIRED
context.load_cert_chain(certfile=server_cert, keyfile=server_key)
bindsocket = socket.socket()
bindsocket.connect((server_addr, server_port))
Run Code Online (Sandbox Code Playgroud)
我在上面的脚本中使用私钥。它可以正常工作,没有任何错误。但是,当我尝试使用 bind() 而不是 connect() 时,即
bindsocket.bind((server_addr, server_port))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
OSError: [Errno 99] 无法分配请求的地址
我已经阅读了许多有关上述错误的相关问题,但是,我仍然不明白为什么会发生这种情况。因为我有主机名、端口、证书和密钥,所以我希望能够成功创建 TLS 连接。
第二个问题是如何建立TLS连接?我的脚本正确吗?
我非常感谢任何改进脚本的评论。
请注意,您将在此处看到代码的过度简化版本。所以它可能看起来没用。然而,这不是问题。
问题是我有一个像这样的主要模板类:
// The primary template class
template<int N>
struct Start {
int start;
template<typename... Args>
int operator()(Args... args) const {return start;}
};
Run Code Online (Sandbox Code Playgroud)
当我专门研究这个类模板时:
// Specialization for N=1:
template<>
struct Start<1> {
int operator()(int i) const {return start;}
};
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
error: ‘start’ was not declared in this scope
int operator()(int i) const {return start;}
Run Code Online (Sandbox Code Playgroud)
为什么start不在类的范围内声明Start<1>?
我很感激任何建议。
我正在寻找最快的 SHA1 实现,因为我必须对其进行数百万次计算。我尝试了boost::uuids::detail::sha1和OpenSSL SHA1,我发现 OpenSSL 比 boost 快 2.5 倍。我还检查了Crypto++,它比其他两个慢得多。以下是我检查他们表现的方法:
#include "openssl/sha.h"
void sha1_ossl (const unsigned char* data) {
unsigned char hash[20];
for (long i=0; i<100000000; ++i) {
SHA1(data, 64, hash);
if ((unsigned int)hash[0]==0 && (unsigned int)hash[1]==0 && (unsigned int)hash[2]==0 && (unsigned int)hash[3]==0)
break;
}
}
Run Code Online (Sandbox Code Playgroud)
#include <boost/uuid/detail/sha1.hpp>
void sha1_boost (const unsigned char* data) {
boost::uuids::detail::sha1 sha1;
unsigned hash[5];
for (long i=0; i<100000000; ++i) {
sha1.process_bytes(data, 64);
sha1.get_digest(hash);
sha1.reset(); …Run Code Online (Sandbox Code Playgroud) 我想检查一个参数列表是否可以转换为size_t。我认为这可能std::is_convertible_v是来自 STL 的正确工具。这是我想象的应该是(这是错误的):
#include <type_traits>
template<typename... Args>
constexpr bool check_all_convertible ()
{
return std::is_convertible_v<Args,size_t>;
}
Run Code Online (Sandbox Code Playgroud)
我终于想用check_all_convertible()来启用另一个功能:
template<typename... Args>
std::enable_if_t<check_all_convertible<Args...>(), void>
some_function (Args... args) {}
Run Code Online (Sandbox Code Playgroud)
std::is_convertible_v可变参数?我感谢任何改进上述代码的建议。
c++ ×4
boost ×1
c++17 ×1
c++20 ×1
crypto++ ×1
openssl ×1
optimization ×1
performance ×1
python-3.x ×1
ssl ×1
tls1.2 ×1