gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:49:44 26 4
gpt4 key购买 nike

我遇到一个问题,我需要能够在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com