algorithm - 编码/解码随机的、固定长度的字符串到 64 位整数和从 64 位整数解码
问题描述
我想将一个固定长度(比如 50 个字符长的随机字符串)转换为 64 位整数,并能够在给定 64 位整数的情况下将其转换回原始文本。
是否存在用于此的算法?我想使用编码/解码而不是散列/反向查找。
解决方案
只是对评论的总结......
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...
推荐阅读
- reactjs - 如何在 reactJS 中创建一个自定义钩子,当单击浏览器后退按钮时会弹出一个确认框。取消时停留在同一页面上?
- java - Android Textview 速度慢,甚至根本不起作用
- typescript - 打字稿——定义“空对象”类型
- c++ - 如何提高CRC-5计算的时间效率?
- html - 如何在 django 模板中的一行中显示来自 db 的输出文本
- javascript - 将文件内容上传到文本区域
- regex - 正则表达式,对新行有限制
- python - Scrapy 看不到 del HTML 标签内的数据
- macos - 卸载所有公式和依赖项 - Homebrew
- r - 在 R 中的两个向量中检查位置相关的重复项