У меня есть ограничение с некоторыми аппаратными средствами, с которыми я работаю, в которых я могу только передавать (без проводов) 26 символов.Можно ли уменьшить длину DateTime.Now.Ticks.ToString ("X") и сохранить уникальность?
Чтобы преодолеть это ограничение, первая передача передает временную метку, преобразованную в шестнадцатеричную (DateTime.Now.Ticks.ToString("X")
), вместе с длиной передаваемого сообщения (также как шестнадцатеричная строка).
Тесты Принимающего программного обеспечения для сообщений заголовка, и когда он подтверждает, что он получает один, сохраняет метку времени (заново преобразованная в long
) в словаре:
/*************************************************************************
* _pendingMessages.Add(DateTime.Now.Ticks, Tuple.Create(MessageLength, string.Empty));
* T.Item1 = Message Length
* T.Item2 = Message (when Message.Length == Length, Pop Message)
*************************************************************************/
private static Dictionary<long, Tuple<long, string>> _pendingMessages;
К сожалению, штамп времени должен быть каждый раз, и это ... более половины отведенной длины символа (сейчас у 15 символов).
Так я думал, что, вместо того, передать всю метку времени, что я мог бы быть в состоянии уменьшить его путем суммирования стоимости символов в шестнадцатеричной строки:
Для примера:
DateTime.Now.Ticks.ToSTring("X").Sum(C => C).ToString("X");
К сожалению, быстрый тест подорвал эту идею прочь довольно бесцеремонно
(дублирующие клавиши довольно быстро):
Dictionary<string, long> _dctTest = new Dictionary<string, long>();
while (true){
long dtNow = DateTime.Now.Ticks;
string strKey = dtNow.ToString("X").Sum(C => C).ToStrings("X");
_dctTest.Add(strKey, dtNow); //<=====Explodes after less than a second.
}
Итак, мой вопрос: есть ли способ для меня надежно уменьшить длину моего «ключа», хотя и по-прежнему (разумно), гарантируя уникальность?
Выезд «G» здесь: HTTP://stackoverflow.com/questions/15072552/use-scientific-notation-only-if-needed. Вы также можете сохранить хеш http://stackoverflow.com/questions/3404715/c-sharp-hashcode-for-array-of-ints, обрабатывая каждую цифру как член массива int, например, 1234 становится int [] {1, 2,3,4}; –
Какую точность вы действительно требуете? Клещи также не гарантированы быть уникальными, если вы не сделаете что-то [подобное этому] (http://stackoverflow.com/a/14369695/74757). –
@ Cᴏʀʏ Да; Я видел этот пост, пока смотрел. Есть разумная задержка между передачами сообщений, так что это не так, как будто я запускаю космические челноки или что-то там, где миллисекунда означает, что вы заканчиваете курс триллионов километров или что-то в этом роде. – Will