python中如何把一个长字符串 映射为 一个短字符串

z752964360 2010-12-31 12:26:31
比如吧30位的字符串映射为 20位的 而且是 唯一的,就像单项散列!
...全文
513 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2010-12-31
  • 打赏
  • 举报
回复
永动机后的另一个神话就是无限压缩算法。
fibbery 2010-12-31
  • 打赏
  • 举报
回复
用算法来算的话,想做到纯粹的唯一,恐怕不太可能。

如果30位字符串的数量不超过20位字符串所表示的数量的话,可以直接建立映射表,这样也简单。
feilniu 2010-12-31
  • 打赏
  • 举报
回复
参考hashlib。

不过LZ要考虑想要的是字符串还是字节流。
单向hash函数,md5返回16字节,sha1返回20字节,如果用hex字符串形式表示,分别是32个字符和40个字符。
shyokou 2010-12-31
  • 打赏
  • 举报
回复
前提是来源于单项散列, 就不会 "简单" "重复" 啦, 而且实现起来最快啦, 以至于 很懒很粗暴 ;-)

[Quote=引用 9 楼 z752964360 的回复:]

引用 7 楼 shyokou 的回复:

如果从上方下来的是来源于单项散列, 也可以简单地将 "30位" 截断到 "20位" 直接用的 ...

引用 4 楼 z752964360 的回复:

纯粹唯一 肯定是不可能的,其实我在做一个腾讯平台的接入,腾讯吧QQ号捂得很死,不会直接给你,给你一个“openid” 近30个字符 ,我们的数据库 id 就20字符长,要改的话,涉及……
[/Quote]
z752964360 2010-12-31
  • 打赏
  • 举报
回复
帅 哥说的对!多谢
fibbery 2010-12-31
  • 打赏
  • 举报
回复
节省程序员的时间成本,比耗费程序员的时间成本提高机器运行成本,更加值得,而且,在没有实践的情况下,很难断定孰优孰劣。值得权衡一下。
fibbery 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 z752964360 的回复:]
映射表如何建立?python 中有没有现成的库?
是不是自己在数据库里建立一个新表?
每次解析出openid后和映射的id存入这个新表,以后每次解析的时候再次查找表。
加了这些操作,性能上损失很大?
[/Quote]

计算一个映射,不见得有一个查表操作快。除非你不建立索引,进行全表扫描。
另外,也可以根据程序的具体实现,将该表以哈希表的方式保存在内存中。
fibbery 2010-12-31
  • 打赏
  • 举报
回复
建立一个数据库表,字段至少包括:openid, ownid,其中ownid为你们的20位字符串id。

每得到一个openid,就向该表插入一行数据,生成ownid,在使用时,可以直接从该表进行查找。建议这两个字段均建立唯一索引,方便正向逆向查找换算。
z752964360 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 shyokou 的回复:]

如果从上方下来的是来源于单项散列, 也可以简单地将 "30位" 截断到 "20位" 直接用的 ...

引用 4 楼 z752964360 的回复:

纯粹唯一 肯定是不可能的,其实我在做一个腾讯平台的接入,腾讯吧QQ号捂得很死,不会直接给你,给你一个“openid” 近30个字符 ,我们的数据库 id 就20字符长,要改的话,涉及的表都要改~所以想写个映射。
[/Quote]
截断的话,简单粗暴! 很可能重复!
z752964360 2010-12-31
  • 打赏
  • 举报
回复
映射表如何建立?python 中有没有现成的库?
是不是自己在数据库里建立一个新表?
每次解析出openid后和映射的id存入这个新表,以后每次解析的时候再次查找表。
加了这些操作,性能上损失很大?
shyokou 2010-12-31
  • 打赏
  • 举报
回复
如果从上方下来的是来源于单项散列, 也可以简单地将 "30位" 截断到 "20位" 直接用的 ...

[Quote=引用 4 楼 z752964360 的回复:]

纯粹唯一 肯定是不可能的,其实我在做一个腾讯平台的接入,腾讯吧QQ号捂得很死,不会直接给你,给你一个“openid” 近30个字符 ,我们的数据库 id 就20字符长,要改的话,涉及的表都要改~所以想写个映射。
[/Quote]
feilniu 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 z752964360 的回复:]

纯粹唯一 肯定是不可能的,其实我在做一个腾讯平台的接入,腾讯吧QQ号捂得很死,不会直接给你,给你一个“openid” 近30个字符 ,我们的数据库 id 就20字符长,要改的话,涉及的表都要改~所以想写个映射。
[/Quote]

这种情况还是建立映射表吧。直接每为一个openid生成一个对应的数据库id。
iambic 2010-12-31
  • 打赏
  • 举报
回复
这要看openid的字符集了。如果只是ascii可见字符就很简单。
z752964360 2010-12-31
  • 打赏
  • 举报
回复
纯粹唯一 肯定是不可能的,其实我在做一个腾讯平台的接入,腾讯吧QQ号捂得很死,不会直接给你,给你一个“openid” 近30个字符 ,我们的数据库 id 就20字符长,要改的话,涉及的表都要改~所以想写个映射。

37,718

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧