如何从 UUID 和盐字符串生成有符号的 32 位整数?

问题描述 投票:0回答:1

我不太了解我的小技巧,需要一些帮助。

我希望生成一个数字,用作两个不同脚本代理之间的一次性“通信通道”,以便在使用 32 位无符号整数作为通信通道的系统中相互同步。我需要这个,因为多“组”代理可能在同一空间中运行,并且系统将消息传递给给定通道的所有订阅者,因此让每对同步代理在单独的通道上运行是有益的为了减少系统服务器需要传递的消息数量。

目标是让 2 个代理代表选定的用户,使用两条已知信息独立选择相同的通道进行通信;用户的类型 4 UUID 和预设的标识符字符串。通过这种方式,多个这样的代理对可以在多个用户的同一系统中运行,而串扰的可能性最小。

我几年前遇到过一个函数,如下所示,它确实产生整数范围的数字。 我在脚本对的每一“侧”提供了一个预设的字符串盐,使它们与同一空间中的其他类型的代理不同(但彼此相同),然后混合给定对的用户的 UUID为了区分相同设置的对。

我迄今为止一直使用的伪代码如下所示:

function integer choose_channel(string UUID, string salt){
    string int = (string)((integer)("0x"+subString(UUID,-8,-1)) * Length(salt) * Ceil(Log(Length(salt))));
    return (integer)llGetSubString(setint, 0, 7);
}

此函数获取 UUID 的尾部,利用 4 类 UUID 中十六进制的使用并转换为整数。然后使用盐字符串的长度更改结果。它有效,但这也意味着盐字符串几乎没有意义——长度才是最重要的。 “abcde”和“*F1@w”的盐将为同一用户产生相同的结果。

有没有一种方法可以使用盐字符串(默认为 UTF16,但如果需要,我可以进行转换)以使用盐字符串中字符的唯一性的方式更改生成的整数,但会生成安全的 32 位带符号的整数?

bit-manipulation uuid
1个回答
0
投票

这个机制似乎对我有用,受到 Nate Eldredge 将它们散列在一起的建议的启发。

伪:

integer number_based_on_ID(string UUID, string salt)
{
    string hash = Copy_String( HMAC( UUID, salt) ,0,3); // Copy 4 characters
    bytes = [  ((dword = (( Base64Encode(Copy_String(hash, 0, 3) + "==") >>  8) & 0xFFFFF)) >> 16), ((dword >> 8) & 0xFF), (dword & 0xFF) ];
    return (integer)( "0x"+(string)bytes );
}

以 1000 个批次运行通常会返回 2-4 次碰撞,这似乎运行良好。

© www.soinside.com 2019 - 2024. All rights reserved.