一、GUID數據因毫無規律可言形成索引效率低下,影響了系統的性能,那麼經過組合的方式,保留GUID的10個字節,用另6個字節表示GUID生成的時間(DateTime),這樣咱們將時間信息與GUID組合起來,在保留GUID的惟一性的同時增長了有序性,以此來提升索引效率,在NHibernate中,COMB型主鍵的生成代碼以下所示:ide
/// <summary> /// 保留GUID的10個字節,用另6個字節表示GUID生成的時間(DateTime)組合方式 /// </summary> /// <returns></returns> public static Guid GenerateComb() { byte[] guidArray = Guid.NewGuid().ToByteArray(); DateTime baseDate = new DateTime(1900, 1, 1); DateTime now = DateTime.Now; // Get the days and milliseconds which will be used to build //the byte string TimeSpan days = new TimeSpan(now.Ticks - baseDate.Ticks); TimeSpan msecs = now.TimeOfDay; // Convert to a byte array // Note that SQL Server is accurate to 1/300th of a // millisecond so we divide by 3.333333 byte[] daysArray = BitConverter.GetBytes(days.Days); byte[] msecsArray = BitConverter.GetBytes((long) (msecs.TotalMilliseconds / 3.333333)); // Reverse the bytes to match SQL Servers ordering Array.Reverse(daysArray); Array.Reverse(msecsArray); // Copy the bytes into the guid Array.Copy(daysArray, daysArray.Length - 2, guidArray, guidArray.Length - 6, 2); Array.Copy(msecsArray, msecsArray.Length - 4, guidArray, guidArray.Length - 4, 4); return new Guid(guidArray); }
上述方法循環測試生成id以下圖性能
結論:適合大型應用。即保留GUID的惟一性的同時增長了GUID有序性,提升了索引效率;解決了關聯表業務問題;生成的Id不夠友好;佔據了32位。測試
二、將GUID轉爲了19位數字ui
/// <summary> /// 根據GUID獲取19位的惟一數字序列 /// </summary> public static long GuidToLong() { byte[] buffer = Guid.NewGuid().ToByteArray(); return BitConverter.ToInt64(buffer, 0); }
上述方法循環測試生成id以下圖編碼
結論:適合大型應用,從業務上來講,有一個規則的編碼能體現產品的專業成度。spa