【发布时间】:2017-01-08 18:17:00
【问题描述】:
我正在使用的某些硬件存在限制,其中我只能广播(无线)26 个字符。
为了克服这个限制,第一个广播传输一个转换为十六进制 (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”:stackoverflow.com/questions/15072552/…。您还可以存储一个哈希 stackoverflow.com/questions/3404715/… 将每个数字视为 int 数组的成员,例如 1234 变为 int[]{1,2,3,4};
-
您实际需要什么精度?蜱也不能保证是唯一的,除非你做某事like this。
-
@Cᴏʀʏ 是的;我在看的时候看到了那个帖子。消息传输之间有合理的延迟,所以它不像我在发射航天飞机或其他毫秒意味着你最终偏离航向一万亿公里之类的东西。
-
@ShannonHolsinger 不熟悉“G”...可能值得研究。
-
@Will:你可以通过减去一个已知值来减少几位数字,比如直到本世纪初的滴答数,然后再对其进行任何操作。另一方面,加回已知的刻度数。
标签: c# datetime timestamp compression