首页 > 解决方案 > 编码/解码随机的、固定长度的字符串到 64 位整数和从 64 位整数解码

问题描述

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

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

标签: algorithmencodinghashdecoding

解决方案


只是对评论的总结......

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

现在,如果您想将 13 char ( a..z)编码text为 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...


推荐阅读