首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 【字符串压缩】如何将一个限长的字符串处理后,产生一个长度为原始字符串1/20的结果字符串? [已结贴,结贴人:panxin]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 22:04:12 楼主
    现在需要一个算法,能够将一个限长字符串转换为一个长度为前者1/20的结果字符串。
    比如:
    原始字符串长度为1024,经过处理后,得到一个长度为50的结果字符串。
    要求:
    1 原始字符串长度固定,一般为1024。
    2 结果字符串长度固定,一般为50。
    3 结果字符串中的字符必须是可见字符,不能包含像回车、制表符这样的字符。

    请大家帮忙给一些思路。
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • anqini
    • 等级:
    发表于:2008-05-03 22:11:401楼 得分:0
    是随即的抽出50个字符,组合成一个字符串?你想要这样的字符串的集合?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 22:13:522楼 得分:0
    不是有一些字符串相关操作的方法吗?不需要什么算法啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 22:15:163楼 得分:0
    楼上没说清楚哎
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 22:16:584楼 得分:0
    你要求太高了,在这里抛砖引玉吧,过两天我再来看
    Java code
    // 将一个字符串按照zip方式压缩和解压缩 public class ZipUtil { // 压缩 public static String compress(String str) throws IOException { if (str == null || str.length() == 0) { return str; } ByteArrayOutputStream out = new ByteArrayOutputStream(); GZIPOutputStream gzip = new GZIPOutputStream(out); gzip.write(str.getBytes()); gzip.close(); return out.toString("ISO-8859-1"); } // 解压缩 public static String uncompress(String str) throws IOException { if (str == null || str.length() == 0) { return str; } ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayInputStream in = new ByteArrayInputStream(str .getBytes("ISO-8859-1")); GZIPInputStream gunzip = new GZIPInputStream(in); byte[] buffer = new byte[256]; int n; while ((n = gunzip.read(buffer)) >= 0) { out.write(buffer, 0, n); } // toString()使用平台默认编码,也可以显式的指定如toString("GBK") return out.toString(); } // 测试方法 public static void main(String[] args) throws IOException { System.out.println(ZipUtil.compress("syj")); System.out.println(ZipUtil.uncompress(ZipUtil.compress("syj"))); } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 22:17:005楼 得分:0
    嗯,结果字符串经过算法的逆处理后是可以还原成原始字符串的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 22:21:426楼 得分:0
    我看过一个外国网站有用到这样的算法,但是不知道是怎么实现的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 22:28:017楼 得分:0
    讲清楚呀
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 22:41:168楼 得分:0
    现在需要一个算法,能够将一个限长字符串转换为一个长度为前者1/20的结果字符串。
    比如:
    原始字符串长度为1024,经过处理后,得到一个长度为50的结果字符串。
    要求:
    1 原始字符串长度固定,一般为1024。
    2 结果字符串长度固定,一般为50。
    3 结果字符串中的字符必须是可见字符,不能包含像回车、制表符这样的字符。

    补充一点:
    结果字符串通过对以上算法的逆处理可以还原成原始字符串。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 22:57:369楼 得分:0
    压缩率要达到 95% 以上,而且压缩后的长度是固定的,已经很成熟的
    压缩算法都达不到这么高的压缩率。

    就这两点可以看出,要求不是比较高啦,要求是相当高

    如果能做出来的话,我就不用 WinRAR 来压缩了,呵呵。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • anqini
    • 等级:
    发表于:2008-05-03 23:06:4010楼 得分:0
    才理解楼主的需求了...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 23:12:0111楼 得分:0
    关注,学习中
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 23:22:4512楼 得分:0
    呵呵,可是确实有这样的需求,不知道是不是我理解需求有误。
    给大家一个google的参考:
    http://code.google.com/intl/zh-CN/apis/maps/signup.html
    在这个页面的下面随便输入一个网址,然后点击“生成 API 密钥”的按钮,就可以看见结果了。
    注意,你需要有google的帐号哦。

    不论你输入多长的url字符串,google的结果总是86个字符。

    大家帮我想一下他是怎么做的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-04 09:06:0713楼 得分:50
    这只是个密钥,并不是压缩啊,像这样生成的只是消息摘要,上面
    并没有说可以把那 86 个字符给还原了啊,也不可能还原。想想看
    好了,这 86 个字符不可能包括无穷无尽的字符的吧,肯定是有重
    码的,但是这个重码率小得几乎没有。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-04 10:13:0314楼 得分:0
    不会不会。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-04 10:14:3115楼 得分:0
    用md5随便算一下行不?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-04 10:23:5216楼 得分:0
    引用 15 楼 xyz20003 的回复:
    用md5随便算一下行不?

    要20位呢
    md5 只能16位或者32位

    更重要的一点是,楼主需要可逆的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-04 10:55:3317楼 得分:0
    关注!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wdman
    • 等级:
    发表于:2008-05-04 11:14:2918楼 得分:0
    期待人类智慧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wbchn
    • 等级:
    发表于:2008-05-04 11:17:3919楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-04 12:32:3220楼 得分:0
    很好的课题研究哦!
    等俺研究成功了再来告诉你哈!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-04 13:55:5221楼 得分:20
    如果原始字符串都是字母和数字等,尚有可能。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-04 14:15:2222楼 得分:0
    这就是一个加密算法嘛。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-04 14:18:3923楼 得分:0
    楼主说的是不是把他转换成了2进制的然后换了个数据类型的那个东西哦,不过貌似达不到1/20哦
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-04 15:19:1624楼 得分:0
    天哪!1/20,2 个半字节压缩到 1 bit ,还要还原!

    除非原始文本有很强的规律性,否则,不可能 ……
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ciitc
    • 等级:
    发表于:2008-05-04 17:40:4725楼 得分:0
    该回复于2008-05-04 18:35:45被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-04 20:12:1626楼 得分:0
    不太现实...可能某些情况可以...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • r_swordsman
    • 等级:
    发表于:2008-05-05 09:11:3027楼 得分:0
    引用楼主 panxin 的帖子:
    现在需要一个算法,能够将一个限长字符串转换为一个长度为前者1/20的结果字符串。
    比如:
    原始字符串长度为1024,经过处理后,得到一个长度为50的结果字符串。
    要求:
    1 原始字符串长度固定,一般为1024。
    2 结果字符串长度固定,一般为50。
    3 结果字符串中的字符必须是可见字符,不能包含像回车、制表符这样的字符。

    请大家帮忙给一些思路。


    可以压缩成2 个字节,前提是这些字节都是重复的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 10:50:1728楼 得分:0
    期待中
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 13:00:3429楼 得分:0
    CONTINUE TO MARK
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 13:21:4330楼 得分:0
    期待ing
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 13:23:0531楼 得分:30
    不可能任何字符串都做到你的要求
    因为1024个字符的串包含的可能(只以字母、数字计算)有(26+26+10)^1024次方的可能

    而结果只有50个字符,可能变成了 62^50可能性。这无形中已经将变化数下降了,根据抽屉原理就已经知道必须存在多个原始字符串会映射到同一个结果字符串,也就是它不可能逆向得到原始字符串了。


    所以不可能做到对任何字符都可以逆向解压的,只有个别的有特殊性的字符串才可能
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 14:27:0332楼 得分:0
    可以用数据字典,使用一个短字符串,可以从字典中查处制定的长字符串。反之亦可。这样对于算法的要求不高,但是对数据字典制作要求很高。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-05 22:28:2433楼 得分:0
    谢谢各位,结贴!
    修改 删除 举报 引用 回复

    网站简介广告服务