QDesignerMemberSheetPrivate::Info &QDesignerMemberSheetPrivate::ensureInfo(int index) { InfoHash::iterator it = m_info.find(index); if (it == m_info.end()) { it = m_info.insert(index, Info()); } return it.value(); }
InfoHash InfoHash::getRandom() { InfoHash h; crypto::random_device rdev; std::uniform_int_distribution<uint8_t> rand_byte; std::generate(h.begin(), h.end(), std::bind(rand_byte, std::ref(rdev))); return h; }
InfoHash PublicKey::getId() const { InfoHash id; size_t sz = id.size(); if (gnutls_pubkey_get_key_id(pk, 0, id.data(), &sz) != GNUTLS_E_SUCCESS || sz != id.size()) return {}; return id; }
InfoHash RoutingTable::middle(const RoutingTable::const_iterator& it) const { unsigned bit = depth(it); if (bit >= 8*HASH_LEN) throw std::out_of_range("End of table"); InfoHash id = it->first; id.setBit(bit, true); return id; }
InfoHash Certificate::getId() const { if (not cert) return {}; InfoHash id; size_t sz = id.size(); if (gnutls_x509_crt_get_key_id(cert, 0, id.data(), &sz) != GNUTLS_E_SUCCESS || sz != id.size()) throw CryptoException("Can't get certificate public key ID."); return id; }
InfoHash InfoHash::get(const uint8_t* data, size_t data_len) { InfoHash h; size_t s = h.size(); const gnutls_datum_t gnudata = {(uint8_t*)data, (unsigned)data_len}; const gnutls_digest_algorithm_t algo = (HASH_LEN == 64) ? GNUTLS_DIG_SHA512 : ( (HASH_LEN == 32) ? GNUTLS_DIG_SHA256 : ( (HASH_LEN == 20) ? GNUTLS_DIG_SHA1 : GNUTLS_DIG_NULL )); static_assert(algo != GNUTLS_DIG_NULL, "Can't find hash function to use."); int rc = gnutls_fingerprint(algo, &gnudata, h.data(), &s); if (rc == 0 && s == HASH_LEN) return h; throw std::string("Error while hashing"); }
std::vector<Sp<Node>> RoutingTable::findClosestNodes(const InfoHash id, time_point now, size_t count) const { std::vector<Sp<Node>> nodes; nodes.reserve(count); auto bucket = findBucket(id); if (bucket == end()) { return nodes; } auto sortedBucketInsert = [&](const Bucket &b) { for (auto n : b.nodes) { if (not n->isGood(now)) continue; auto here = std::find_if(nodes.begin(), nodes.end(), [&id,&n](Sp<Node> &node) { return id.xorCmp(n->id, node->id) < 0; } ); nodes.insert(here, n); } }; auto itn = bucket; auto itp = (bucket == begin()) ? end() : std::prev(bucket); while (nodes.size() < count && (itn != end() || itp != end())) { if (itn != end()) { sortedBucketInsert(*itn); itn = std::next(itn); } if (itp != end()) { sortedBucketInsert(*itp); itp = (itp == begin()) ? end() : std::prev(itp); } } // shrink to the count closest nodes. if (nodes.size() > count) { nodes.resize(count); } return nodes; }