从 40 个字符的字符串创建一个 5 个字符的唯一标识符

Create a 5 chars unique identifier from a 40 characters string

我有一个列表,其中包含 10 到最多 300 个字符串代码(40 个大写的单词字符)需要存储在 oauth2 Access Token(基于声明的授权)中; 我必须尽可能地保持令牌小(header 大小问题)所以我正在寻找一种方法来创建一个小的唯一标识符来表示令牌中的原始字符串。

然后我将创建一个查找 table,我将在其中放置 uid 和原始字符串。
当客户端发送令牌时,通过 uid 和查找 table 我将取回原始字符串。

我了解到可以截断散列的第一个字节(MD5、SHA1),我想知道我是否可以安全地遵循此路径。

是否可以安全地(在冲突方面)创建这些字符串的哈希值(唯一)列表,其中每个哈希值最多为 4/5 字节?

编辑:
我不能 pre-generate 一个随机字符串作为索引(或者只是一个列表索引),因为这个列表可能会改变并增加大小(例如,当服务器应用程序被部署并且新代码被添加到这个列表时) 所以我必须确保当我从客户端取回令牌时,uid 将绑定到正确的代码。

是的,这些散列算法中的任何一个都提供统一的散列码,其中每一位不应携带比其他任何位更多的信息。您可以只取其中的任意 4-5 个字节(只要您从每个代码中取相同的字节)并用作较小的哈希码。

自然地,散列码越短,冲突风险就越高,但对于该散列码长度,您仍然会获得尽可能低的冲突风险。

编辑:

随着问题的改变;不,您不能使用哈希码创建 唯一 标识符。使用足够长的哈希码,您可以使冲突变得足够少,以至于哈希码可以用作几乎所有实际应用程序的唯一标识符,但 32 位哈希码不会这样做,128 位哈希码可以做到这一点。