c# - C# 和 javascript 中 guid 的相同哈希值

标签 c# javascript hash guid

我遇到一个问题,我需要能够在 javascript 和 C# 中为 GUID 生成相同的均匀分布的数字哈希。我想这会阻止我在 C# 中使用 Guid.GetHashCode(),因为如果不对 C# 进行逆向工程,我无法在 JS 中重现该行为。

在 JS 中有快速方法从 guids/strings 生成散列吗? .NET 生成的 GUID 中字符串的所有数字是否均匀分布?我应该只将尾随字符强制转换/转换为 int 吗?

最佳答案

字节显然分布不均。

我整理了一些代码来对 .NET Guid 进行采样并绘制分布图:

首先是测试代码,这会创建一百万个 Guid 并计算字节数组中每个字节的不同值的数量。它将所有内容输出到我在 Scilab 中绘制的矩阵中.

int[,] counter = new int[16, 256];
for (int i = 0; i < 1000000; i++)
{
    var g = Guid.NewGuid();
    var bytes = g.ToByteArray();
    for (int idx = 0; idx < 16; idx++)
    {
        counter[idx, bytes[idx]]++;
    }
}
StringBuilder sb = new StringBuilder();
sb.AppendLine("x = [");
for (int idx = 0; idx < 16; idx++)
{
    for (int b = 0; b < 256; b++)
    {
        sb.Append(counter[idx, b]);
        if (idx != 255)
        {
            sb.Append(" ");
        }
    }
    if (idx != 15)
    {
        sb.AppendLine(";");
    }
}
sb.AppendLine("]");

File.WriteAllText("plot.sce", sb.ToString());

这是分布,图表绘制了字节数组中每个位置的每个不同值的数量:

字节数组中位置0-6的值分布: The value distribution for the positions 0-6 in the byte array
字节数组中位置7的值分布:
The value distribution for the position 7 in the byte array
字节数组中位置8的值分布:
The value distribution for the position 8 in the byte array
字节数组中第9-15位的值分布: The value distribution for the positions 9-15 in the byte array

对于字节位置 0-6 和 9-15,值的分布似乎是均匀的,但对于字节位置 7 和 8,分布相当有限。

也就是说,对于 guid(下面是字节位置的开头,注意奇怪的顺序)

{1369ea05-b9f9-408b-ac7c-7ebd0f35d562}
                         1 1 1 1 1 1
 3 2 1 0  5 4  7 6  8 9  0 1 2 3 4 5

位置7可以取值从64(0x40)到79(0x4F)。
位置 8 可以取值从 128 (0x80) 到 191 (0xBF)。
其余字节均匀分布。

注意:测试是在 32 位 Windows 7 机器上的 .NET4 上运行的。

教训:不要假设东西,要测试。

回答:要使用 .NET Guids 来计算您的负载平衡,您可以使用上面 Guid 中标记为 7 和 8 的位置以外的任何部分。

问题:有人知道为什么分布不均匀吗?

关于c# - C# 和 javascript 中 guid 的相同哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3509271/

相关文章:

javascript - vuejs 动画网格内的列表项

php - 使用返回 0 的查询行比较 mysql 密码哈希(不工作)

c# - 如何确定修改文件的最后一个进程?

c# - 这个无效的对象名称从何而来?

JavaScript 将参数传递给按钮 onclick 函数

javascript - 如何使用 Node.js 作为网站的门户

javascript - 如何在 JavaScript 数组上使用模和按位 XOR 运算符反转算法?

hash - 如何检查两个散列密码是否相同?

c# - Visual Studio 无法识别 MvxFragment 的 BindingInflate 函数

c# - 已解析上下文 (.toList()) 和未解析上下文的区别