请问如何将自增id通过某种算法映射得出6位既包含字母又包含数字的随机字符串?

2013-07-26 17:39:24 +08:00
 leonwong
字符串间不能冲突以及字符串中字母大小写不敏感
5610 次点击
所在节点    问与答
34 条回复
79bxh9b
2013-07-28 09:52:09 +08:00
id转成字符串,前面用0补足位数,再把id字符串反转,再一步base58编码
想更随机只要给base58的字典做随机乱序就行
binux
2013-07-28 10:25:41 +08:00
@leonwong 当然
leonwong
2013-07-28 13:26:06 +08:00
@binux 这样算法代价会不会有点高,存储代价也挺高的
shiny
2013-07-28 13:27:55 +08:00
@leonwong 如果短网址代码就能满足需求,有个好处是足够简单,能够直接互转。以下是我写的 PHP 版本和 python 版本,最初生成的 PHP 算法来源于 phurl。

http://gist.github.com/shiny/6097499
http://gist.github.com/shiny/6097505
binux
2013-07-28 13:28:01 +08:00
@leonwong 你的id肯定对应一些数据吧,比如说数据库的某一行。把字符串存起来,用id查也是查,用映射后的串查也是查,有什么不同?
leonwong
2013-07-28 13:28:12 +08:00
@79bxh9b base算法不太了解,能麻烦说说原理和特点是什么吗?
shiny
2013-07-28 13:28:33 +08:00
leonwong
2013-07-28 13:32:32 +08:00
@shiny 感谢提供代码!!定当好好捉摸!
leonwong
2013-07-28 13:46:29 +08:00
@binux 有点道理!我需要另外建立一张表来存储映射关系吗?这样就有点像独立标签这样了,那这些标签要按照一定规律保持唯一性,算法怎么实现?
binux
2013-07-28 15:27:11 +08:00
@leonwong 认真读我第一个回复
79bxh9b
2013-07-28 18:49:24 +08:00
@leonwong 其实楼上shiny贴的代码就是base算法,只是用了54个字符。
base58就是用了58个字符的版本,123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ
manoon
2013-07-28 20:38:28 +08:00
mongodb 不就是这样的么?
leonwong
2013-07-29 00:24:47 +08:00
@binux 其实我的意思是不太明白随机洗牌怎么实现?
leonwong
2013-07-29 00:30:47 +08:00
@79bxh9b 原来如此,我百度了下,很少对base算法有系统介绍,学习了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/77066

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX