如何从3个值创建唯一的ID
本文关键字:int ID DateTime 唯一 3个 创建 | 更新日期: 2023-09-27 17:54:36
我正在解析一个在线提要(tcp中继),它每秒发送大约30-50条消息(300-500行数据)。消息包含两种类型的信息:订单和历史。
那么,对于订单,每个订单都有一个唯一的ID,我得到:
private static Dictionary<long,MarketOrder> MarketOrders = new Dictionary<long,MarketOrder>();
在中插入订单。数据来自缓存文件,因此消息可以包含旧的数据,必须过滤掉。我现在正在做这个:
if (MarketOrders.ContainsKey(order.OrderID))
{
// If record exists in a dictionary add hits and overwrite the object if newer.
int hits = MarketOrders[order.OrderID].Hits;
if (MarketOrders[order.OrderID].LastUpdated < order.LastUpdated)
{
MarketOrders[order.OrderID] = order;
}
MarketOrders[order.OrderID].Hits = hits + 1;
}
else
{
// If not, add new one
order.Hits = 1;
MarketOrders.Add(order.OrderID, order);
}
这在BackgroundWorker进程中运行,当字典项数达到2500时,它被深度克隆(使用二进制序列化器),清除并启动另一个后台进程,将克隆副本插入数据库中。一旦字典被清除,就会再次插入订单。所以基本上,我试着接收尽可能多的数据,然后分批插入数据库。
我试图做一些类似的历史数据。没有唯一的ID,唯一性来自<int, int, DateTime>
值的组合。
我需要一种从这3个值生成唯一键的快速方法,这样我就可以像处理订单一样将其存储在字典中,或者使用另一种存储和过滤数据的方法。
有什么建议吗?我的目标是。net 4.0
Dictionary
的键不一定是简单类型。在您的情况下,最简单的解决方案是使用Tuple<int, int, DateTime>
作为密钥。另一种选择是创建自定义类型,正确实现Equals()
和GetHashCode()
(最好也实现IEquatable
)。
您可以在数据库端做同样的事情,大多数数据库支持复合键。
您可以创建一个Guid
并使用它作为密钥:
byte[] bytes = new byte[16];
BitConverter.GetBytes(i1).CopyTo(bytes, 0);
BitConverter.GetBytes(i2).CopyTo(bytes, 4);
BitConverter.GetBytes(dt.Ticks).CopyTo(bytes, 8);
Guid key = new Guid(bytes);
在循环中运行上面的Dictionary<Guid, int>
和Dictionary<Tuple<int, int, DateTime>, int>
, Guid
键似乎更快,但你应该在你的场景中测试它。
只是为了澄清,我使用Dictionary<Guid, int>
进行测试,但在您的情况下,它将是Dictionary<Guid, YourHistoryType>
。如果您的代码中发生了其他事情,那么使用Guid
和Tuple<int, int, DateTime>
之间的任何差异都可以忽略不计,您可以使用任何感觉更合适的方法,我不会感到惊讶。
将所有数据放入数组或其他对象中并进行序列化,您认为如何?
此外,您可以使用MD5算法将所有这些打包成固定长度的字符串。
我更喜欢svick的答案,但只是把它扔在那里如何嵌套Dictionary
?Dictionary<int, Dictionary<int, Dictionary<DateTime, object>>>
。可能吗?它允许快速查找项目集合
这样怎么样:
int i1 = 123123;
int i2 = 23433;
DateTime dt = DateTime.Now;
string s;
s = i1.ToString("X") + i2.ToString("X") + dt.Ticks.ToString();
唯一的方法就是这样做,
DateTime dt = GetYourDateTime();
string uniqueID = dt.Year + "" + dt.Month + "" + dt.Day + "" + dt.Hour + "" + dt.Minute + "" + dt.Second + "" + dt.Millisecond + "";
你可以将其转换为任何数字类型,如十进制,长等
int a = 2000;
int b = 3000;
DateTime dt = GetYourDateTime();
string uniqueID = a + "-" + b+ "-" +dt.Year + "" + dt.Month + "" + dt.Day + "" + dt.Hour + "" + dt.Minute + "" + dt.Second + "" + dt.Millisecond + "";
2013年1月11日:2000-3000-2013011100000000
2013年11月1日:2000-3000-2013110100000000