如何从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

如何从3个值创建唯一的ID <int, int, DateTime>

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>。如果您的代码中发生了其他事情,那么使用GuidTuple<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