将名称字符串编码为唯一编号

Lon*_*guy 4 string algorithm math text

我有一大堆名字(数百万).它们中的每一个都有名字,可选的中间名和姓氏.我需要将这些名称编码为唯一代表名称的数字.编码应该是一对一,即名称应该只与一个数字相关联,并且数字应该只与一个名称相关联.

什么是编码的智能方法?我知道根据字母集中的位置(a-> 1,b-> 2 ..等等)标记每个字母的名称很容易,所以像Deepa这样的名字会得到 - > 455161,但是如果'16'真的是16或1和6的组合,我无法弄清楚.

所以,我正在寻找一种智能的名称编码方式.

此外,编码应该使得任何名称的输出数字中的数字位数应该具有固定的数字位数,即,它应该与长度无关.这可能吗?

谢谢Abhishek S.

use*_*476 9

要获得相同的宽度数字,你不能只在左边填零吗?

一些选择:

  1. 排序他们.数数吧.第10个名字是10号.
  2. 将每个字符视为基数为26(不区分大小写,无数字)或52(大小写,无数字)或36(对数字不区分大小写)或62(区分大小写)数字.计算int中的值.EG,对于名称"abc",你有0*26 ^ 2 + 1*26 ^ 1 + 2*20 ^ 0.有时中文名称可能会使用数字来表示音调.
  3. 使用"完美散列"方案:http://en.wikipedia.org/wiki/Perfect_hash_function
  4. 这个主要是有趣的建议:使用goedel编号:).所以"abc"将是2 ^ 0*3 ^ 1*5 ^ 2 - 它是素数幂的乘积.保理号码可以让你回到角色.但数字可能会变得非常大.
  5. 如果您还没有使用它,请转换为ASCII.然后将字符的每个序数视为base-256编号系统中的数字.所以"abc"是0*256 ^ 2 + 1*256 ^ 1 + 2*256 ^ 0.

如果您需要能够不时更新您的姓名和号码列表,那么#2,#4和#5应该有效.#1和#3会有问题.#5可能是最具前瞻性的,但你可能会发现在某些时候你需要unicode.

我相信你可以使用unicode作为#5的变体,使用2 ^ 32而不是2 ^ 8 == 256的幂.


kra*_*nko 3

你试图做的实际上是散列(至少如果你有固定数量的数字)。有一些很好的哈希算法,几乎没有冲突。例如,尝试一下 sha1,它经过了良好的测试并且可用于现代语言(请参阅http://en.wikipedia.org/wiki/Sha1)——它似乎对于 git 来说足够好,所以它可能适合您。

当然,两个不同名称的相同哈希值的可能性很小,但哈希总是出现这种情况,并且可以处理。使用 sha1 之类的名称和 ID 之间不会有任何明显的联系,这可能是好事也可能是坏事,具体取决于您的问题。

如果你确实想要唯一的ID,你需要像NealB建议的那样,自己创建ID并连接数据库中的名称和ID(你可以随机创建它们并检查冲突或增加它们,从0000000000001左右开始) 。

(经过一番思考并阅读第一条评论后改进了答案)