我来自SQL server世界,我们有uniqueidentifier.在甲骨文中有同等的东西吗?将经常查询此列,因此性能是关键.
我在.Net中生成GUID并将其传递给Oracle.由于一些原因它不能由oracle生成,所以我不能使用序列.
下面描述的行为仅适用于.net-3.5
我刚刚遇到了C#编译器中最令人惊讶的行为;
我有以下代码:
Guid g1 = Guid.Empty;
bool b1= (g1 == null);
Run Code Online (Sandbox Code Playgroud)
好吧,Guid不可为空,因此永远不能等于null.我在第2行进行的比较总是返回false.
如果对整数做同样的事情,编译器会发出警告,说结果总是为false:
int x=0;
bool b2= (x==null);
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么编译器允许你将Guid与null进行比较?
据我所知,它已经知道结果总是错误的.
内置转换是否以编译器假定null为可能值的方式完成?
我在这里错过了什么吗?
如何在Windows中使用命令行运行的批处理文件中生成GUID?
当您ToByteArray()在.NET中调用GUID时,结果数组中的字节顺序与GUID的字符串表示形式相比不是您所期望的.例如,对于以下表示为字符串的GUID:
11223344-5566-7788-9900-aabbccddeeff
Run Code Online (Sandbox Code Playgroud)
结果ToByteArray()是这样的:
44, 33, 22, 11, 66, 55, 88, 77, 99, 00, AA, BB, CC, DD, EE, FF
Run Code Online (Sandbox Code Playgroud)
请注意,前四个字节的顺序是相反的.字节4和5也交换,字节6和7交换.但是最后的8个字节的顺序与它们在字符串中表示的顺序相同.
我知道这种情况正在发生.我想知道的是.NET为什么会这样处理它.
问题:有更好的方法吗?
VB.Net
Function GuidToBase64(ByVal guid As Guid) As String
Return Convert.ToBase64String(guid.ToByteArray).Replace("/", "-").Replace("+", "_").Replace("=", "")
End Function
Function Base64ToGuid(ByVal base64 As String) As Guid
Dim guid As Guid
base64 = base64.Replace("-", "/").Replace("_", "+") & "=="
Try
guid = New Guid(Convert.FromBase64String(base64))
Catch ex As Exception
Throw New Exception("Bad Base64 conversion to GUID", ex)
End Try
Return guid
End Function
Run Code Online (Sandbox Code Playgroud)
C#
public string GuidToBase64(Guid guid)
{
return Convert.ToBase64String(guid.ToByteArray()).Replace("/", "-").Replace("+", "_").Replace("=", "");
}
public Guid Base64ToGuid(string base64)
{
Guid guid = default(Guid);
base64 = …Run Code Online (Sandbox Code Playgroud) 有没有办法获得Sql Server 2005+ Sequential Guid生成器的功能,而无需插入记录来回读往返或调用本机win dll调用?我看到有人回答使用rpcrt4.dll,但我不确定是否可以从我的托管环境中进行生产.
编辑:使用@John Boker的答案我试图把它变成GuidComb生成器的更多,而不是依赖于最后生成的Guid而不是重新开始.对于种子,而不是从我使用的Guid.Empty开始
public SequentialGuid()
{
var tempGuid = Guid.NewGuid();
var bytes = tempGuid.ToByteArray();
var time = DateTime.Now;
bytes[3] = (byte) time.Year;
bytes[2] = (byte) time.Month;
bytes[1] = (byte) time.Day;
bytes[0] = (byte) time.Hour;
bytes[5] = (byte) time.Minute;
bytes[4] = (byte) time.Second;
CurrentGuid = new Guid(bytes);
}
Run Code Online (Sandbox Code Playgroud)
我根据评论做了这个
// 3 - the least significant byte in Guid ByteArray
[for SQL Server ORDER BY clause]
// 10 - the most significant byte in Guid ByteArray …Run Code Online (Sandbox Code Playgroud) 我有一个excel文件,每行有一个订单,我希望每个订单都有一个唯一的标识符,因此会有一个唯一ID列.每次我填写一行,我希望Excel为我自动填充唯一ID列.我做了一些研究,并指出了GUID的方向.我找到了以下代码:
Function GenGuid() As String
Dim TypeLib As Object
Dim Guid As String
Set TypeLib = CreateObject("Scriptlet.TypeLib")
Guid = TypeLib.Guid
' format is {24DD18D4-C902-497F-A64B-28B2FA741661}
Guid = Replace(Guid, "{", "")
Guid = Replace(Guid, "}", "")
Guid = Replace(Guid, "-", "")
GenGuid = Guid
End Function
Run Code Online (Sandbox Code Playgroud)
但我不确定如何实现它.任何帮助将不胜感激.先感谢您.
在您开始将其标记为重复之前,请将我读出来.另一个问题是(很可能)不正确的接受答案.
我不知道.NET如何生成其GUID,可能只有微软这样做,但它很有可能只是调用CoCreateGuid().但是,该函数被记录为调用UuidCreate().并且用于创建UUID的算法已被很好地记录.
长话短说,尽管如此,似乎System.Guid.NewGuid()确实使用了版本4 UUID生成算法,因为它生成的所有GUID都符合标准(参见自己,我尝试了几百万个GUID,它们都匹配).
换句话说,除了一些已知位之外,这些GUID 几乎是随机的.
这再次提出了一个问题 - 随机是如何随机的?正如每个优秀的小程序员都知道的那样,伪随机数算法只与其种子(即熵)一样随机.那么种子是UuidCreate()什么?PRNG如何重新播种?它是加密强大的,或者如果两台计算机同时意外呼叫System.Guid.NewGuid(),我可以期望相同的GUID开始倾泻吗?如果收集到足够多的顺序生成的GUID,是否可以猜测PRNG的状态?
补充:为了澄清,我想知道我可以信任的随机性因此 - 我在哪里可以使用它.那么,让我们在这里建立一个粗略的"随机性"量表:
我在想到是否可以将它们用作数据库ID时,以及Guid.comb算法的实现System.Guid.NewGuid()(如NHibernate的实现方式)是否有缺陷,我就来到了这个问题.
我不理解RFC 6455中"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"的含义.为什么服务器需要这个神奇的字符串?为什么WebSocket协议需要这种机制?