C#中与PHP的uniqid()函数对应的函数是什么?

3

我希望能够在C#中复制一些PHP代码。该PHP代码使用uniqid函数,并将更高熵参数设置为true。有什么好的方法可以在C#中最好地复制这个功能呢?

http://us2.php.net/uniqid


这是否类似于.NET术语中的GUID? - JohnC
2个回答

14

通过一些谷歌搜索,我找到了PHP的uniqid如何工作,并在C#中实现了它:

private string GetUniqID()
{
    var ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
    double t = ts.TotalMilliseconds / 1000;

    int a = (int)Math.Floor(t);
    int b = (int)((t - Math.Floor(t)) * 1000000);

    return a.ToString("x8") + b.ToString("x5");
}

这段代码提供了完全相同的结果,唯一的区别是未实现uniqid()的额外参数。


它不提供完全相同的结果。如果您在循环内调用此函数,则会生成多个重复的ID,而在PHP中执行相同操作时,所有ID都将是唯一的。 - Bréndal Teixeira

8

something like:

string uniqid(string prefix, bool more_entropy) {
    if(string.IsNullOrEmpty(prefix)) 
      prefix = string.Empty;

    if (!more_entropy) {
      return (prefix + System.Guid.NewGuid().ToString()).Left(13);
    } else {
      return (prefix + System.Guid.NewGuid().ToString() + System.Guid.NewGuid().ToString()).Left(23);
    }
 }

编辑:为了反映评论意见

这是一个非常简单的脑海中的解决方案,我建议您研究正式的“随机”数字生成,例如通过System.Math命名空间直接实现。请参阅关于随机数生成的这些其他SO问题和答案,以获取更严谨的解决方案。

System.Guid.NewGuid().ToString()

将为您提供唯一的字符串。


非常感谢 - 这正是我所想的,但我想确认一下。 - JohnC
1
请记住,只有整个Guid应该几乎肯定是唯一的。对于其字符串表示的某个部分来说,这并不一定是真的。请参阅http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx。 - VolkerK
在C#中,String.Left()应该改为使用String.Substring()。 - sshow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接