将单词转换为唯一标识符

Transform a word into a unique identifier

我的目标是将单词转换为唯一标识符(数字)。

"WORD" => X(例如)

但是要应用的数学(或其他方法)公式必须是确定性传递性字符顺序很重要

例如,我们将 transform 定义为数学函数的名称,例如:

变换("WORD") => X

Rules/Goals:

  1. 必须是确定性的:

    if transform("WORD") => X 那么 transform 公式必须总是 return X。所以 transform 公式不能是 "Memory address of variables" 例如。

  2. 传递性(可选,出于性能目的最好有)

    if tranform("WORD") => X 然后 tranform("WORDS") => Y 其中 Y > X。

  3. 顺序很重要

    tranform("WORD") 必须不同于 tranform("ROWD")

任意 Idea/Approach?

我已经尝试过以下方法,但它不正确:

  1. Ascii字符码

    transform("WORD") = 87+79+82+68 = 316

    transform("ROWD") = 82+79+87+68 = 316

    所以规则 3 失败

假设是 ASCII,您可以简单地将每个字符解释为 [0, 128] 上的数字。

那么你的话就是以 128 为基数的数字。

您的传递要求未指定,但这种方法至少在字长上是传递的。

听起来您正在尝试生成某种哈希码。 Java 的 hashCode() 的 String 实现相当简单,因此用另一种语言实现类似的东西并不困难。

算法来自Java API Docs

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

s[i]是字符串的第i个字符,n是字符串的长度

将字符串转换为 n 进制数字绝对是关键(如其他答案所述)。以下是表示 transform 函数输出的方法:

我假设你的转换应该是十进制数字序列的形式。我还假设您的字符在 ASCII 范围内(总共 128 种可能性)

关键是为初始字符串中的每个字母分配 3 个数字。每个三位数位置的值被设置为从0到127的字母(或字符)的索引。

变换函数是这样工作的:

transform(C1C2C3) = index[C1]index[C2]index[C3]

其中索引 returns 显示给定字符 Cx 位置的三位数字序列(即 001、020 或 120)。结果相互串联(不累加)。

示例为:

变换("WORD") = 087079082068

显示 transform 函数涵盖您的所有规则现在很容易。