【问题标题】:Convert string into fixed length numbers and convert it back将字符串转换为固定长度的数字并将其转换回来
【发布时间】:2017-01-19 20:47:12
【问题描述】:

我有超过 100 个 cpp 文件。我需要为他们每个人分配唯一的 ID。我还需要根据他们的 ID 知道它是哪个文件。我发现文件名的最大长度包含 64 个字符,ID 最多只能是 8 个字节长。是否有任何算法可以帮助在 C++ 中为 VS2013 中的源文件分配唯一 ID,并且还可以让用户知道它基于 ID 是哪个文件?

只需存储文件名和整数之间的映射。 -----是的,这种方式很简单。但是每次人们创建新的课程文件时,都需要重新编码映射。所以我不会用这种方式。

这是原始问题,因此下面的评论有意义

现在我有一堆字符串,例如“AAA”或“ABBCCHH”。字符串的最大值包含 64 个字符。现在我需要一个可以将字符串转换为数字的算法(不一定是整数,双浮点也可以)。但是数字的长度必须是固定的。例如,如果“A”转换为12312,5位,“ABBHGGH”转换后也应该有5位。这些数字也可以转换回原始字符串。有没有算法可以做到这一点?转换后的数字不能超过 8 个字节。这就是为什么我不能只使用 ASCII 等简单算法。我不知道哪种算法可以做到这一点。

【问题讨论】:

  • 是的。你试过什么?
  • 如何确定数字的长度?您的输入字符集是未定义的(ASCII、UTF-8、只是大写字母等),但即使采用最保守的方法,您也有(26^64)+(26^63)+...+(26) 可能的输入字符串,这是一个指数为90 的数字。您将需要大量数字来编码所有可能的输出。
  • @Andy - 我不确定发帖人是否知道他想要什么。我认为这个问题需要思考和重写
  • 缺乏正确的术语使这个问题很难解释......
  • “但是每次人们创建新的课程文件时,映射都需要重新编码”——你已经说过很多次了。我不明白这是什么意思。我认为您描述的是多个人将他们的文件存储在一个公共目录中,但是当新文件进入时,为什么“映射”会被“重新编码”(?)?只需在每个文件进入时为其分配下一个可用编号。您是否担心编号用完?

标签: string algorithm encryption numbers decimal


【解决方案1】:

要生成任意一组文件名的唯一 ID(此处的实际问题),您可以使用加密哈希(SHA-1、-256、-384、-512)。这将产生一个唯一的、固定长度的十六进制输出。如果您不能在输出中允许字符a-f,您可以将十六进制值转换为十进制。

此过程不可逆,但您可以维护输入值到 ID 的映射(查找表)。

如果您想要更简单的解决方案,只需对文件名进行十六进制编码。这是可逆的。 (如果需要,您也可以在此处添加十六进制 -> 十进制转换)。

【讨论】:

  • 如果您要存储映射(即转换数字->文件名),为什么还要使用 SHA 等。只需存储下一个未使用的 id 号。当出现新文件名时,将其分配给该值
  • 海报也花了 32 分钟部分描述了真正的问题
  • @EdHeal,我同意顺序分配最简单,但 OP 明确表示他们不想根据顺序分配数字(为什么,我不知道)。
  • 我已经在评论中说 SHA 不符合我的要求。如果我需要一张地图来存储 SHA,我什至不需要 SHA。
  • 如果 SHA-1 占用太多字节,请在您想要的任何长度边界处截断它。您已经多次更改要求。如果您不想要地图,只需使用编码并截断它。但请注意,如果文件名的截断段不是唯一的,您可能会发生冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 2015-07-21
  • 2019-02-15
相关资源
最近更新 更多