将单词转换为唯一标识符
Transform a word into a unique identifier
我的目标是将单词转换为唯一标识符(数字)。
"WORD" => X(例如)
但是要应用的数学(或其他方法)公式必须是确定性、传递性和字符顺序很重要
例如,我们将 transform
定义为数学函数的名称,例如:
变换("WORD") => X
Rules/Goals:
必须是确定性的:
if transform
("WORD") => X 那么 transform
公式必须总是 return X。所以 transform
公式不能是 "Memory address of variables" 例如。
传递性(可选,出于性能目的最好有)
if tranform
("WORD") => X
然后 tranform
("WORDS") => Y 其中 Y > X。
顺序很重要
tranform
("WORD") 必须不同于 tranform
("ROWD")
任意 Idea/Approach?
我已经尝试过以下方法,但它不正确:
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
函数涵盖您的所有规则现在很容易。
我的目标是将单词转换为唯一标识符(数字)。
"WORD" => X(例如)
但是要应用的数学(或其他方法)公式必须是确定性、传递性和字符顺序很重要
例如,我们将 transform
定义为数学函数的名称,例如:
变换("WORD") => X
Rules/Goals:
必须是确定性的:
if
transform
("WORD") => X 那么transform
公式必须总是 return X。所以transform
公式不能是 "Memory address of variables" 例如。传递性(可选,出于性能目的最好有)
if
tranform
("WORD") => X 然后tranform
("WORDS") => Y 其中 Y > X。顺序很重要
tranform
("WORD") 必须不同于tranform
("ROWD")
任意 Idea/Approach?
我已经尝试过以下方法,但它不正确:
Ascii字符码
transform
("WORD") = 87+79+82+68 = 316transform
("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
函数涵盖您的所有规则现在很容易。