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

2013-07-26 17:39:24 +08:00
 leonwong
字符串间不能冲突以及字符串中字母大小写不敏感
5587 次点击
所在节点    问与答
34 条回复
rwx
2013-07-26 18:12:28 +08:00
自增ID -> 无限
6位字符串 -> 有限
把无限集映射到有限集这种事。。
qiayue
2013-07-26 18:21:07 +08:00
数字 0-9 10个
字母 a-z 26个
字母 A-Z 26个
字符 _和- 2个

用以上字符按照 64 (10 + 26 + 26 +2 = 64) 进制与自增 ID 进行一一对应

另外,64^6 = 68719476736 ,最多 687 亿数据

要想更多数据,增大进制,也就是增多字符即可
qiayue
2013-07-26 18:22:53 +08:00
没看清楚字母大小写不敏感,那么,就只能是去掉大写字母,成了 38 进制了
leonwong
2013-07-26 18:31:32 +08:00
@rwx 自增肯定有限,有长度限制
leonwong
2013-07-26 18:34:02 +08:00
@qiayue 那其实这样就是一个38进制的值的自增,我想体现多点随机性,最好这六位中不要出现纯数字,这种方式映射必然会出现纯数字的情况
jybox
2013-07-26 18:36:21 +08:00
MD5取前6位...
lichao
2013-07-26 18:37:58 +08:00
@leonwong 你既然是随机,就必然有纯数字的,虽然比例很低
@jybox 没试过,只有前 6 位,安全吗?
leonwong
2013-07-26 18:44:27 +08:00
@jybox 会撞车吧,不能撞车
rrfeng
2013-07-26 18:45:08 +08:00
我估计你的自己设计算法了……
leonwong
2013-07-26 18:45:22 +08:00
@lichao 我的意思就是不希望由另一个自增来取代这个自增,想增加点随机性
leonwong
2013-07-26 18:45:49 +08:00
@rrfeng 就是不会设计才请教你们的,各位大大
lichao
2013-07-26 18:46:16 +08:00
@rrfeng 你可以自己做个试验,从 1 到 10 亿,MD5 取前 6 位试试,看有没有重复的,没有的话,就算是安全的
leonwong
2013-07-26 18:48:41 +08:00
微博短链接貌似很符合我的要求,谁能把短链接算法跟我说说,麻烦了
leonwong
2013-07-26 18:49:29 +08:00
@lichao 好,这个值得一试,我个人要求百万数据就足够了
binux
2013-07-26 19:04:55 +08:00
将6位字符按照一定的规律选出一定量,随机洗牌,存下来
不够了,再选一定的量,随机洗牌,存下来
shiny
2013-07-26 19:28:01 +08:00
@leonwong 短链的算法是可以逆向的,如果要随机还是 @binux 的方案靠谱。
msg7086
2013-07-27 16:20:19 +08:00
@leonwong http://ra.gg/!iMD4o 我实现的。
leonwong
2013-07-28 09:32:11 +08:00
@lichao 经过漫长的测试,插入79026值时候,md5前六位和前面有所重复
leonwong
2013-07-28 09:36:00 +08:00
@shiny 其实逆向我觉得没关系,可以逆向,所以我也没有非要用MD5不可,@binux 算法能保证唯一性吗?
leonwong
2013-07-28 09:37:42 +08:00
@msg7086 有点大神的感觉,我研究下

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

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

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

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

© 2021 V2EX