我想生成一个很长的UUID - 类似于gmail使用的会话密钥.它应至少为256个字符且不超过512个字符.它可以包含所有字母数字字符和一些特殊字符(键盘上功能键下方的字符).这已经完成了还是有样品?
C++或C#
更新:GUID是不够的.我们已经看到了碰撞,需要解决这个问题.512是迄今为止的最大值,因为它会阻止我们更改已经发货的东西.
更新2:对于坚持GUID独特性的人,如果有人想猜测你的下一个会话ID,他们就不必计算下一个万亿年的组合.他们所要做的只是限制时间因素,它们将在数小时内完成.
可能重复:
如何从GUID生成8个字节的唯一ID?
我需要一个唯一的密钥来识别通用的用户,密钥的长度只有8个字节,如何在c#中执行此操作?
我需要从多个线程生成一个唯一的序列号。我创建了下面的简单类,它似乎有效,但我不确定是否可以依赖序列号的唯一性。
此外,如果超过 999999,我需要能够让数字回到 0。我不希望它滚动很长时间,因为该方法每天调用的次数可能少于 100 次。我知道系统会在有机会达到 999999 之前定期关闭以进行维护。
GetSequenceNumber
将从 BizTalk 映射中的 xslt 转换调用该方法,并且可以多次调用该方法(在同一个 BizTalk 主机实例中)。
在我的开发系统上,即使 BizTalk 同时多次调用该方法,它似乎也能正常工作并生成不同的值。开发系统只有一个 BizTalk 主机实例在运行。
然而,在生产系统上,有两台服务器。我是否认为这种方法不能保证跨服务器的唯一性,因为它们运行在不同的应用程序域中?
我无法使用 guid,因为序列号限制为 16 个字符。
public class HelperMethods
{
private static int sequenceNumber = 0;
public string GetSequenceNumber()
{
string result = null;
int seqNo = Interlocked.Increment(ref sequenceNumber);
result = string.Format("{0:MMddHHmmss}{1:000000}", DateTime.Now, seqNo);
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为我可以使用服务器计算机名称并添加一些任意字符,这样即使在一台服务器上生成的序列号与另一台服务器上生成的序列号相同,它仍然会有所不同,但我不确定它有多独特这将是。像这样的东西:
string seqNumber = (MachineName == "Blah" ? "A" : "B") + GetSequenceNumber();
Run Code Online (Sandbox Code Playgroud)
有没有人对我如何创建唯一的序列号有任何建议?它不必是完全独特的,我只需要不太可能发生碰撞。另外,如果以线程安全的方式达到 1000000,我如何将数字重置回 0?
我需要从 C# 中的整数列表生成唯一值的列表。我以为是 MD5 或类似的,但它们生成了太多字节。
整数大小为 2 个字节。
例如,我想获得单向通信
0 -> ARY812Q3
1 -> S6321Q66
2 -> 13TZ79K2
Run Code Online (Sandbox Code Playgroud)
因此,在证明哈希值时,用户无法知道整数或干扰哈希值列表后面的序列。
现在,我尝试使用 MD5(我的号码),然后使用前 8 个字符。但是我在 51389 处发现了第一次碰撞。我还可以使用哪些其他替代方案?
正如我所说,我只需要一种方法。没有必要能够从哈希值中计算出整数。系统使用字典来查找它们。
更新:
回复一些关于使用 GetHashCode() 的建议。GetHashCode 返回相同的整数。我的目的是向最终用户隐藏整数。在这种情况下,整数是数据库的主键。我不想将这些信息提供给用户,因为他们可以推断出数据库中的记录数或每周记录的增量。
哈希值不是唯一的,所以也许我需要使用像 TripleDes 这样的加密,但我想使用快速而简单的东西。此外,TripleDes 也返回太多字节。
更新 2:我正在谈论哈希,这是一个错误。事实上,我试图混淆它,我尝试使用哈希算法,这不是一个好主意,因为它们不是唯一的。