**breaking** use Name TLV-VALUE as input to murmurHash3
Previously the library was using Name URI string, which is not guaranteed
to be stable and unique.
refs #4838
Change-Id: Ic5e29f11f1320f95a754fb5def03faeb4d89cc01
diff --git a/PSync/consumer.cpp b/PSync/consumer.cpp
index 1b100cb..6c77ed3 100644
--- a/PSync/consumer.cpp
+++ b/PSync/consumer.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2020, The University of Memphis
+ * Copyright (c) 2014-2022, The University of Memphis
*
* This file is part of PSync.
* See AUTHORS.md for complete list of PSync authors and contributors.
@@ -60,7 +60,7 @@
}
m_subscriptionList.emplace(prefix);
- m_bloomFilter.insert(prefix.toUri());
+ m_bloomFilter.insert(prefix);
if (callSyncDataCb && seqNo != 0) {
m_onUpdate({{prefix, seqNo, seqNo}});
@@ -130,7 +130,7 @@
// Extract IBF from name which is the last element in hello data's name
m_iblt = m_helloDataName.getSubName(m_helloDataName.size() - 1, 1);
- NDN_LOG_TRACE("m_iblt: " << std::hash<std::string>{}(m_iblt.toUri()));
+ NDN_LOG_TRACE("m_iblt: " << std::hash<ndn::Name>{}(m_iblt));
detail::State state{ndn::Block(bufferPtr)};
std::vector<MissingDataInfo> updates;
@@ -175,7 +175,7 @@
ndn::Interest syncInterest(syncInterestName);
NDN_LOG_DEBUG("sendSyncInterest, nonce: " << syncInterest.getNonce() <<
- " hash: " << std::hash<std::string>{}(syncInterest.getName().toUri()));
+ " hash: " << std::hash<ndn::Name>{}(syncInterest.getName()));
if (m_syncFetcher) {
m_syncFetcher->stop();
diff --git a/PSync/detail/bloom-filter.cpp b/PSync/detail/bloom-filter.cpp
index 56c70b9..041ead0 100644
--- a/PSync/detail/bloom-filter.cpp
+++ b/PSync/detail/bloom-filter.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2020, The University of Memphis
+ * Copyright (c) 2014-2022, The University of Memphis
*
* This file is part of PSync.
* See AUTHORS.md for complete list of PSync authors and contributors.
@@ -250,7 +250,7 @@
}
void
-BloomFilter::insert(const std::string& key)
+BloomFilter::insert(const ndn::Name& key)
{
std::size_t bit_index = 0;
std::size_t bit = 0;
@@ -266,7 +266,7 @@
}
bool
-BloomFilter::contains(const std::string& key) const
+BloomFilter::contains(const ndn::Name& key) const
{
std::size_t bit_index = 0;
std::size_t bit = 0;
diff --git a/PSync/detail/bloom-filter.hpp b/PSync/detail/bloom-filter.hpp
index e01828b..9aa4e6f 100644
--- a/PSync/detail/bloom-filter.hpp
+++ b/PSync/detail/bloom-filter.hpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2020, The University of Memphis
+ * Copyright (c) 2014-2022, The University of Memphis
*
* This file is part of PSync.
* See AUTHORS.md for complete list of PSync authors and contributors.
@@ -90,10 +90,10 @@
clear();
void
- insert(const std::string& key);
+ insert(const ndn::Name& key);
bool
- contains(const std::string& key) const;
+ contains(const ndn::Name& key) const;
private:
typedef uint32_t bloom_type;
diff --git a/PSync/detail/util.cpp b/PSync/detail/util.cpp
index a7fd947..3e58d77 100644
--- a/PSync/detail/util.cpp
+++ b/PSync/detail/util.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2020, The University of Memphis
+ * Copyright (c) 2014-2022, The University of Memphis
*
* This file is part of PSync.
* See AUTHORS.md for complete list of PSync authors and contributors.
@@ -116,6 +116,13 @@
return h1;
}
+uint32_t
+murmurHash3(uint32_t seed, const ndn::Name& name)
+{
+ auto wire = name.wireEncode();
+ return murmurHash3(wire.value(), wire.value_size(), seed);
+}
+
std::shared_ptr<ndn::Buffer>
compress(CompressionScheme scheme, const uint8_t* buffer, size_t bufferSize)
{
diff --git a/PSync/detail/util.hpp b/PSync/detail/util.hpp
index e457832..9f6676d 100644
--- a/PSync/detail/util.hpp
+++ b/PSync/detail/util.hpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2020, The University of Memphis
+ * Copyright (c) 2014-2022, The University of Memphis
*
* This file is part of PSync.
* See AUTHORS.md for complete list of PSync authors and contributors.
@@ -32,11 +32,11 @@
uint32_t
murmurHash3(const void* key, size_t len, uint32_t seed);
-inline uint32_t
-murmurHash3(uint32_t seed, const std::string& str)
-{
- return murmurHash3(str.data(), str.size(), seed);
-}
+/**
+ * @brief Compute 32-bit MurmurHash3 of Name TLV-VALUE.
+ */
+uint32_t
+murmurHash3(uint32_t seed, const ndn::Name& name);
inline uint32_t
murmurHash3(uint32_t seed, uint32_t value)
diff --git a/PSync/full-producer.cpp b/PSync/full-producer.cpp
index 048bba3..106dc90 100644
--- a/PSync/full-producer.cpp
+++ b/PSync/full-producer.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2020, The University of Memphis
+ * Copyright (c) 2014-2022, The University of Memphis
*
* This file is part of PSync.
* See AUTHORS.md for complete list of PSync authors and contributors.
@@ -207,7 +207,7 @@
ndn::Name nameWithoutSeq = nameIt->second.getPrefix(-1);
// Don't sync up sequence number zero
if (m_prefixes[nameWithoutSeq] != 0 &&
- !isFutureHash(nameWithoutSeq.toUri(), negative)) {
+ !isFutureHash(nameWithoutSeq, negative)) {
state.addContent(nameIt->second);
}
}
@@ -355,7 +355,7 @@
FullProducer::isFutureHash(const ndn::Name& prefix, const std::set<uint32_t>& negative)
{
auto nextHash = detail::murmurHash3(detail::N_HASHCHECK,
- ndn::Name(prefix).appendNumber(m_prefixes[prefix] + 1).toUri());
+ ndn::Name(prefix).appendNumber(m_prefixes[prefix] + 1));
return negative.find(nextHash) != negative.end();
}
diff --git a/PSync/partial-producer.cpp b/PSync/partial-producer.cpp
index 25e456a..202935c 100644
--- a/PSync/partial-producer.cpp
+++ b/PSync/partial-producer.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2020, The University of Memphis
+ * Copyright (c) 2014-2022, The University of Memphis
*
* This file is part of PSync.
* See AUTHORS.md for complete list of PSync authors and contributors.
@@ -29,6 +29,9 @@
NDN_LOG_INIT(psync.PartialProducer);
+const ndn::name::Component HELLO("hello");
+const ndn::name::Component SYNC("sync");
+
PartialProducer::PartialProducer(size_t expectedNumEntries,
ndn::Face& face,
const ndn::Name& syncPrefix,
@@ -42,9 +45,9 @@
{
m_registeredPrefix = m_face.registerPrefix(m_syncPrefix,
[this] (const ndn::Name& syncPrefix) {
- m_face.setInterestFilter(ndn::Name(m_syncPrefix).append("hello"),
+ m_face.setInterestFilter(ndn::Name(m_syncPrefix).append(HELLO),
std::bind(&PartialProducer::onHelloInterest, this, _1, _2));
- m_face.setInterestFilter(ndn::Name(m_syncPrefix).append("sync"),
+ m_face.setInterestFilter(ndn::Name(m_syncPrefix).append(SYNC),
std::bind(&PartialProducer::onSyncInterest, this, _1, _2));
},
std::bind(&PartialProducer::onRegisterFailed, this, _1, _2));
@@ -69,14 +72,14 @@
void
PartialProducer::onHelloInterest(const ndn::Name& prefix, const ndn::Interest& interest)
{
- if (m_segmentPublisher.replyFromStore(interest.getName())) {
+ const auto& name = interest.getName();
+ if (m_segmentPublisher.replyFromStore(name)) {
return;
}
// Last component or fourth last component (in case of interest with version and segment)
// needs to be hello
- if (interest.getName().get(interest.getName().size()-1).toUri() != "hello" &&
- interest.getName().get(interest.getName().size()-4).toUri() != "hello") {
+ if (name.get(name.size() - 1) != HELLO && name.get(name.size() - 4) != HELLO) {
return;
}
@@ -103,7 +106,7 @@
}
NDN_LOG_DEBUG("Sync Interest Received, nonce: " << interest.getNonce() <<
- " hash: " << std::hash<std::string>{}(interest.getName().toUri()));
+ " hash: " << std::hash<ndn::Name>{}(interest.getName()));
ndn::Name nameWithoutSyncPrefix = interest.getName().getSubName(prefix.size());
ndn::Name interestName;
@@ -173,7 +176,7 @@
for (const auto& hash : positive) {
auto nameIt = m_biMap.left.find(hash);
if (nameIt != m_biMap.left.end()) {
- if (bf.contains(nameIt->second.getPrefix(-1).toUri())) {
+ if (bf.contains(nameIt->second.getPrefix(-1))) {
// generate data
state.addContent(nameIt->second);
NDN_LOG_DEBUG("Content: " << nameIt->second << " " << nameIt->first);
@@ -227,8 +230,8 @@
}
detail::State state;
- if (entry.bf.contains(prefix.toUri()) || positive.size() + negative.size() >= m_threshold) {
- if (entry.bf.contains(prefix.toUri())) {
+ if (entry.bf.contains(prefix) || positive.size() + negative.size() >= m_threshold) {
+ if (entry.bf.contains(prefix)) {
state.addContent(ndn::Name(prefix).appendNumber(m_prefixes[prefix]));
NDN_LOG_DEBUG("sending sync content " << prefix << " " << std::to_string(m_prefixes[prefix]));
}
diff --git a/PSync/producer-base.cpp b/PSync/producer-base.cpp
index bf8bc0e..ff6870d 100644
--- a/PSync/producer-base.cpp
+++ b/PSync/producer-base.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2020, The University of Memphis
+ * Copyright (c) 2014-2022, The University of Memphis
*
* This file is part of PSync.
* See AUTHORS.md for complete list of PSync authors and contributors.
@@ -116,7 +116,7 @@
// Insert the new seq no in m_prefixes, m_biMap, and m_iblt
it->second = seq;
ndn::Name prefixWithSeq = ndn::Name(prefix).appendNumber(seq);
- auto newHash = detail::murmurHash3(detail::N_HASHCHECK, prefixWithSeq.toUri());
+ auto newHash = detail::murmurHash3(detail::N_HASHCHECK, prefixWithSeq);
m_biMap.insert({newHash, prefixWithSeq});
m_iblt.insert(newHash);
}
diff --git a/tests/test-iblt.cpp b/tests/test-iblt.cpp
index c015a19..b2f4d3e 100644
--- a/tests/test-iblt.cpp
+++ b/tests/test-iblt.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2020, The University of Memphis
+ * Copyright (c) 2014-2022, The University of Memphis
*
* This file is part of PSync.
* See AUTHORS.md for complete list of PSync authors and contributors.
@@ -37,7 +37,7 @@
IBLT iblt2(size, CompressionScheme::DEFAULT);
BOOST_CHECK_EQUAL(iblt1, iblt2);
- std::string prefix = Name("/test/memphis").appendNumber(1).toUri();
+ auto prefix = Name("/test/memphis").appendNumber(1);
uint32_t newHash = murmurHash3(11, prefix);
iblt1.insert(newHash);
iblt2.insert(newHash);
@@ -54,17 +54,17 @@
// Header
0x08, 0xB4,
// Uncompressed IBF
- 0x00, 0x00, 0x00, 0x01, 0xF6, 0xA7, 0x7A, 0xBA, 0x6B, 0xA3, 0x4D, 0x63, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5C, 0x5B, 0xF2, 0x67,
+ 0x42, 0x24, 0xEE, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5C, 0x5B, 0xF2, 0x67,
+ 0x42, 0x24, 0xEE, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF6, 0xA7, 0x7A, 0xBA,
- 0x6B, 0xA3, 0x4D, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0xF6, 0xA7, 0x7A, 0xBA, 0x6B, 0xA3, 0x4D, 0x63, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x5C, 0x5B, 0xF2, 0x67, 0x42, 0x24, 0xEE, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
};
@@ -73,7 +73,7 @@
const int size = 10;
IBLT iblt(size, CompressionScheme::DEFAULT);
- auto prefix = Name("/test/memphis").appendNumber(1).toUri();
+ auto prefix = Name("/test/memphis").appendNumber(1);
auto hash = murmurHash3(11, prefix);
iblt.insert(hash);
@@ -110,18 +110,18 @@
IBLT iblt1(size, CompressionScheme::DEFAULT);
- std::string prefix = Name("/test/memphis").appendNumber(1).toUri();
+ auto prefix = Name("/test/memphis").appendNumber(1);
uint32_t hash1 = murmurHash3(11, prefix);
iblt1.insert(hash1);
IBLT iblt2(iblt1);
iblt2.erase(hash1);
- prefix = Name("/test/memphis").appendNumber(2).toUri();
+ prefix = Name("/test/memphis").appendNumber(2);
uint32_t hash3 = murmurHash3(11, prefix);
iblt2.insert(hash3);
iblt1.erase(hash1);
- prefix = Name("/test/memphis").appendNumber(5).toUri();
+ prefix = Name("/test/memphis").appendNumber(5);
uint32_t hash5 = murmurHash3(11, prefix);
iblt1.insert(hash5);
@@ -141,11 +141,11 @@
IBLT ownIBF(size, CompressionScheme::DEFAULT);
IBLT rcvdIBF(size, CompressionScheme::DEFAULT);
- std::string prefix = Name("/test/memphis").appendNumber(3).toUri();
+ auto prefix = Name("/test/memphis").appendNumber(3);
uint32_t hash1 = murmurHash3(11, prefix);
ownIBF.insert(hash1);
- std::string prefix2 = Name("/test/memphis").appendNumber(4).toUri();
+ auto prefix2 = Name("/test/memphis").appendNumber(4);
uint32_t hash2 = murmurHash3(11, prefix2);
rcvdIBF.insert(hash2);
@@ -174,7 +174,7 @@
BOOST_CHECK_EQUAL(positive.size(), 0);
BOOST_CHECK_EQUAL(negative.size(), 0);
- std::string prefix = Name("/test/memphis").appendNumber(1).toUri();
+ auto prefix = Name("/test/memphis").appendNumber(1);
uint32_t newHash = murmurHash3(11, prefix);
ownIBF.insert(newHash);
@@ -183,7 +183,7 @@
BOOST_CHECK_EQUAL(positive.size(), 1);
BOOST_CHECK_EQUAL(negative.size(), 0);
- prefix = Name("/test/csu").appendNumber(1).toUri();
+ prefix = Name("/test/csu").appendNumber(1);
newHash = murmurHash3(11, prefix);
rcvdIBF.insert(newHash);
@@ -204,14 +204,14 @@
IBLT ownIBF(size, CompressionScheme::DEFAULT);
for (int i = 0; i < 50; i++) {
- std::string prefix = Name("/test/memphis" + std::to_string(i)).appendNumber(1).toUri();
+ auto prefix = Name("/test/memphis" + std::to_string(i)).appendNumber(1);
uint32_t newHash = murmurHash3(11, prefix);
ownIBF.insert(newHash);
}
IBLT rcvdIBF = ownIBF;
- std::string prefix = Name("/test/ucla").appendNumber(1).toUri();
+ auto prefix = Name("/test/ucla").appendNumber(1);
uint32_t newHash = murmurHash3(11, prefix);
ownIBF.insert(newHash);
diff --git a/tests/test-producer-base.cpp b/tests/test-producer-base.cpp
index 8e9dd77..30cf4c3 100644
--- a/tests/test-producer-base.cpp
+++ b/tests/test-producer-base.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2020, The University of Memphis
+ * Copyright (c) 2014-2022, The University of Memphis
*
* This file is part of PSync.
* See AUTHORS.md for complete list of PSync authors and contributors.
@@ -47,21 +47,21 @@
BOOST_CHECK_EQUAL(producerBase.getSeqNo(userNode).value(), 0);
producerBase.updateSeqNo(userNode, 1);
- BOOST_CHECK(producerBase.getSeqNo(userNode.toUri()).value() == 1);
+ BOOST_CHECK(producerBase.getSeqNo(userNode).value() == 1);
- std::string prefixWithSeq = Name(userNode).appendNumber(1).toUri();
+ auto prefixWithSeq = Name(userNode).appendNumber(1);
uint32_t hash = producerBase.m_biMap.right.find(prefixWithSeq)->second;
Name prefix(producerBase.m_biMap.left.find(hash)->second);
BOOST_CHECK_EQUAL(prefix.getPrefix(-1), userNode);
producerBase.removeUserNode(userNode);
- BOOST_CHECK(producerBase.getSeqNo(userNode.toUri()) == nullopt);
+ BOOST_CHECK(producerBase.getSeqNo(userNode) == nullopt);
BOOST_CHECK(producerBase.m_biMap.right.find(prefixWithSeq) == producerBase.m_biMap.right.end());
BOOST_CHECK(producerBase.m_biMap.left.find(hash) == producerBase.m_biMap.left.end());
Name nonExistentUserNode("/notAUser");
producerBase.updateSeqNo(nonExistentUserNode, 1);
- BOOST_CHECK(producerBase.m_biMap.right.find(Name(nonExistentUserNode).appendNumber(1).toUri()) ==
+ BOOST_CHECK(producerBase.m_biMap.right.find(Name(nonExistentUserNode).appendNumber(1)) ==
producerBase.m_biMap.right.end());
}