我一直在寻找一种简单的 Java算法来生成伪随机字母数字字符串.在我的情况下,它将被用作一个唯一的会话/密钥标识符,它"很可能"在500K+生成过程中是唯一的(我的需求实际上并不需要更复杂的东西).
理想情况下,我可以根据我的唯一性需求指定长度.例如,生成的长度为12的字符串可能看起来像"AEYGF7K0DM1X".
我想创建一个URL缩短服务,您可以在其中将长URL写入输入字段,该服务将URL缩短为" http://www.example.org/abcdef".
而不是" abcdef"可以有任何其他六个字符包含的字符串a-z, A-Z and 0-9.这使得56到570亿个可能的字符串.
我的方法:
我有一个包含三列的数据库表:
然后我会将长URL插入表中.然后我会选择" id" 的自动增量值并构建它的哈希值.然后应该将此哈希插入为" short".但是我应该构建什么样的哈希?像MD5这样的散列算法会创建太长的字符串.我想,我不使用这些算法.自建算法也可以工作.
我的想法:
对于" http://www.google.de/"我得到自动增量ID 239472.然后我执行以下步骤:
short = '';
if divisible by 2, add "a"+the result to short
if divisible by 3, add "b"+the result to short
... until I have divisors for a-z and A-Z.
Run Code Online (Sandbox Code Playgroud)
这可以重复,直到数字不再可分.你认为这是一个好方法吗?你有更好的主意吗?
由于对该主题的持续兴趣,我发布了一个有效的GitHub解决方案,包括JavaScript,PHP,Python和Java的实现.如果你愿意,可以添加你的解
考虑youtube视频网址(例如):
例如:
http://www.youtube.com/watch?v=-JVkaMqD5mI&feature=related
Run Code Online (Sandbox Code Playgroud)
我在说这个-JVkaMqD5mI部分.(长度= 11)
让我们计算选项:
a-z = 26 |
A-Z = 26 |_______ > 26+26+10+2 = 64 optional chars in 11 places = 64^11 = 73786976294838206464
0-9 = 10 |
-_ = 2 |
Run Code Online (Sandbox Code Playgroud)
我仍然想知道,当他们为新视频生成新ID时,他们是否仍然检查是否已经存在?
我确定他们有一些" 已经生成的ID "的列表(数据库或缓存)......(如果他们这样做,他们每次都会获取数据库?还是在缓存中?或者......?)
或者他们依靠的1.355252...e-20机会差不多0.(但仍然!= 0)
针对这种情况的最佳实践解决方案是什么?
.net ×1
algorithm ×1
alphanumeric ×1
architecture ×1
java ×1
performance ×1
random ×1
string ×1
url ×1