Index: sync/internal_api/public/base/unique_position.cc |
diff --git a/sync/internal_api/public/base/unique_position.cc b/sync/internal_api/public/base/unique_position.cc |
index c3cfd59e3a4f0edad782b21fdcf1db68df64e410..8f3c0a70bf04c69648fab974529ed86d3fe6ab30 100644 |
--- a/sync/internal_api/public/base/unique_position.cc |
+++ b/sync/internal_api/public/base/unique_position.cc |
@@ -5,11 +5,12 @@ |
#include "sync/internal_api/public/base/unique_position.h" |
#include "base/logging.h" |
-#include "base/rand_util.h" |
#include "base/string_number_conversions.h" |
namespace syncer { |
+const size_t UniquePosition::kSuffixLength = 28; |
+ |
// static. |
bool UniquePosition::IsValidSuffix(const std::string& suffix) { |
// The suffix must be exactly the specified length, otherwise unique suffixes |
@@ -20,8 +21,13 @@ bool UniquePosition::IsValidSuffix(const std::string& suffix) { |
// static. |
bool UniquePosition::IsValidBytes(const std::string& bytes) { |
- return bytes.length() > kSuffixLength |
- && bytes[bytes.length()-1] == kTerminatorByte; |
+ // The first condition ensures that our suffix uniqueness is sufficient to |
+ // guarantee position uniqueness. Otherwise, it's possible the end of some |
+ // prefix + some short suffix == some long suffix. |
+ // The second condition ensures that FindSmallerWithSuffix can always return a |
+ // result. |
+ return bytes.length() >= kSuffixLength |
+ && bytes[bytes.length()-1] != 0; |
} |
// static. |
@@ -35,7 +41,6 @@ UniquePosition UniquePosition::CreateInvalid() { |
UniquePosition UniquePosition::FromBytes( |
const std::string& bytes) { |
UniquePosition result(bytes); |
- DCHECK(result.IsValid()); |
return result; |
} |
@@ -93,31 +98,6 @@ UniquePosition UniquePosition::Between( |
return UniquePosition(mid, suffix); |
} |
-// static. |
-const std::string UniquePosition::GenerateUniqueSuffix() { |
- return base::RandBytesAsString(kSuffixLength); |
-} |
- |
-// static. |
-const std::string UniquePosition::GenerateBookmarkSuffix( |
- const std::string& decoded_originator_cache_guid, |
- int64 numeric_originator_item_id) { |
- std::string result(8, 0); |
- |
- // The first 8 bytes come from the originator id. |
- int64 byte_iterator = numeric_originator_item_id; |
- for (int i = 7; i >= 0; --i) { |
- result[i] = static_cast<uint8>(byte_iterator); |
- byte_iterator >>= 8; |
- } |
- |
- // The next 16 bytes come from the decoded cache guid. |
- DCHECK_EQ(16u, decoded_originator_cache_guid.length()); |
- result.append(decoded_originator_cache_guid); |
- |
- return result; |
-} |
- |
UniquePosition::UniquePosition() : is_valid_(false) { }; |
bool UniquePosition::LessThan(const UniquePosition& other) const { |
@@ -170,13 +150,10 @@ std::string UniquePosition::ToDebugString() const { |
std::string UniquePosition::FindSmallerWithSuffix( |
const std::string& reference, |
const std::string& suffix) { |
- // When comparing, we need to take into account the terminator that will be |
- // appended to the suffix when this is made into a UniquePosition. |
- const std::string suffixFF = suffix + kTerminatorByte; |
std::string ret; |
// Does our suffix alone place us where we want to be? |
- if (suffixFF < reference) { |
+ if (suffix < reference) { |
return ""; |
} |
@@ -190,7 +167,7 @@ std::string UniquePosition::FindSmallerWithSuffix( |
// We failed to differentiate ourselves with this digit. But maybe the we |
// can append the suffix at this point and get the position we're looking |
// for that way. |
- if (suffixFF < reference.substr(i+1)) { |
+ if (suffix < reference.substr(i+1)) { |
return ret; |
} |
} |
@@ -207,35 +184,31 @@ std::string UniquePosition::FindSmallerWithSuffix( |
std::string UniquePosition::FindGreaterWithSuffix( |
const std::string& reference, |
const std::string& suffix) { |
- // When comparing, we need to take into account the terminator that will be |
- // appended to the suffix when this is made into a UniquePosition. |
- const std::string suffixFF = suffix + kTerminatorByte; |
- |
std::string ret; |
// Does our suffix alone place us where we want to be? |
- if (reference < suffixFF) { |
+ if (reference < suffix) { |
return ""; |
} |
for (size_t i = 0; i < reference.length(); ++i) { |
const uint8 digit = reference[i]; |
- if (digit != 255) { |
- ret.push_back((digit+256U)/2U); |
+ if (digit != kuint8max) { |
+ ret.push_back(digit + (kuint8max - digit + 1)/2); |
return ret; |
} else { |
- ret.push_back(255); |
+ ret.push_back(kuint8max); |
// We failed to differentiate ourselves with this digit. But maybe the we |
// can append the suffix at this point and get the position we're looking |
// for that way. |
- if (reference.substr(i+1) < suffixFF) { |
+ if (reference.substr(i+1) < suffix) { |
return ret; |
} |
} |
} |
- // Still here? Then we must increase our length in order to exceed before. |
- ret.push_back(255); |
+ // Still here? Then we must increase our length in order to exceed reference. |
+ ret.push_back(kuint8max); |
DCHECK_LT(reference, ret); |
return ret; |
@@ -250,14 +223,10 @@ std::string UniquePosition::FindBetweenWithSuffix( |
DCHECK_NE(before, after); |
DCHECK_LT(before, after); |
- // When comparing, we need to take into account the terminator that will be |
- // appended when this is made into a UniquePosition. |
- const std::string suffixFF = suffix + kTerminatorByte; |
- |
std::string mid; |
// Sometimes our suffix puts us where we want to be. |
- if (before < suffixFF && suffixFF < after) { |
+ if (before < suffix && suffix < after) { |
return ""; |
} |
@@ -267,14 +236,14 @@ std::string UniquePosition::FindBetweenWithSuffix( |
uint8 b_digit = after[i]; |
if (b_digit - a_digit >= 2) { |
- mid.push_back((b_digit + a_digit) / 2U); |
+ mid.push_back(a_digit + (b_digit - a_digit)/2); |
return mid; |
} else if (a_digit == b_digit) { |
mid.push_back(a_digit); |
// Both strings are equal so far. Will appending the suffix at this point |
// give us the comparison we're looking for? |
- if (suffixFF < before.substr(i, 0) && after.substr(i, 0) < suffixFF) { |
+ if (before.substr(i+1) < suffix && suffix < after.substr(i+1)) { |
return mid; |
} |
} else { |
@@ -328,13 +297,12 @@ std::string UniquePosition::FindBetweenWithSuffix( |
UniquePosition::UniquePosition(const std::string& internal_rep) |
: bytes_(internal_rep), |
is_valid_(IsValidBytes(bytes_)) { |
- DCHECK(IsValid()); |
} |
UniquePosition::UniquePosition( |
const std::string& prefix, |
const std::string& suffix) |
- : bytes_(prefix + suffix + kTerminatorByte), |
+ : bytes_(prefix + suffix), |
is_valid_(IsValidBytes(bytes_)) { |
DCHECK(IsValidSuffix(suffix)); |
DCHECK(IsValid()); |