【问题标题】:Encode/decoded a randomized, fixed-length string to and from a 64 bit integer编码/解码随机的、固定长度的字符串到 64 位整数和从 64 位整数解码
【发布时间】:2021-05-30 12:52:28
【问题描述】:

我想将一个固定长度(例如 50 个字符长的随机字符串)转换为 64 位整数,并能够在给定 64 位整数的情况下将其转换回原始文本。

是否存在用于此的算法?我想使用编码/解码而不是散列/反向查找。

【问题讨论】:

  • 你听说过鸽巢原理吗?一个 64 位整数可以容纳 64 位数据,即 1.84e+19 个不同的值。这意味着最多可以来回转换许多字符串。如果您假设字符串只能是小写 a-z,那么您只能在其中压缩 13 个字符。
  • 这在一般情况下似乎是不可能的——您如何能够将 50 个字符的字符串的所有可能性映射到唯一的 64 位值?唯一有效的情况是如果只有两个可能的字符,在这种情况下,您可以将一个编码为 0,另一个编码为 1。或者您必须缩短字符串,要求所有有效字符串更容易遵循可压缩模式等
  • @MooingDuck 是的,我明白了。在我的情况下,碰撞很好,我不需要唯一性。但是为了好玩,让我们来看看你对 13 个字符 a-z 的回答。如何在 64 位整数和 13 个字符的长字符串之间映射随机 a-z 字符串?
  • " 转换为 64 位整数,并能够在给定 64 位整数的情况下将其转换回原始文本。"如果发生碰撞,这基本上是不可能的。它需要独特性。 Pigeonhole Principle
  • 您是否做过将基数为 10 的数字转换为基数为 2 或基数为 16 的数字的练习? (这是一个常见的家庭作业问题)。在这种情况下,您只需将基数为 2 的数字转换为基数为 32 的数字。

标签: algorithm encoding hash decoding


【解决方案1】:

只是对 cme​​ts 的总结...

1:1 字符串和数字之间的映射需要足够的字符和位来存储您的数据。假设只有 26 个字符:

64bit ->  2^64  // possible numbers in 64 bits
1char ->  26    // possible characters per 1 char

所以为了得到适合 64 位整数的字符数

chars = floor( 64 / (log(26)/log(2)) ) 
      = floor( 64 / 4.7004397181410921603968126542567)
      = floor( 13.6 )
      = 13

如果您想知道 50 个字符需要多少位:

bits  = ceil( 50 / (log(2)/log(26)) ) 
      = ceil( 50 / 0.21274605355336315360618778415321
      = ceil( 235.02198590705460801984063271284 )
      = 236

现在,如果您想将 text 中的 13 个字符 (a..z) 编码为 64 位无符号整数 x

char text[13] = "bla bla bla b";
unsigned int x,m,i;
for (i=0,x=0,m=1;i<13;i++,m*=26)
 x += ((unsigned int)(text[i]-'a'))*m;

然后解码:

for (i=0;i<13;i++)
    {
    text[i] = (x%26)+'a';
    x /= 26;
    }

正如你所见,这与在不同基数的数字之间进行转换是一样的......

如果您想以文本大小为代价获得更快的 dec/enc,您可以 ceil 将每个单个字符的位数设置为 5 意思是 floor(64/5) = 12 chars 并改用位操作(每个字符为 5数字中的位数)...

char text[12] = "bla bla bla ";
unsigned int x,i;
for (i=0,x=0,i<12;i++)
   { 
   x <<= 5;
   x |= text[i]-'a';
   }

for (i=0;i<12;i++)
    {
    text[11-i] = (x&31)+'a';
    x >>= 5;
    }

但是,如果您对字符有任何其他了解,则可以实施压缩,但仅在熵允许的情况下...更多信息 google RLE,Huffman encoding...

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 2018-11-28
    • 2017-06-17
    • 2017-11-07
    • 2015-08-12
    • 2014-12-20
    • 1970-01-01
    • 2023-03-26
    • 2011-03-30
    相关资源
    最近更新 更多