我想生成类似goo.gl和jsfiddle网站(http://jsfiddle.net/XzKvP/
)的代码。
我尝试了各种不同的操作,这些操作给了我太大的引导,重复的字母数字代码等。
我想我应该能够基于我的数据库表中的主键生成一个字母数字代码。这样会不会重复?PK是一个自动递增的整数1。但是不确定这样做是如何完成的。
我想要的代码 看起来 是随机的,但它 不是 必须的。例如,我 不
希望1234
数据库中BCDE
的1235
项目为并且项目为BCDF
。
例子:
请注意,URL如何http://jsfiddle.net/XzKvP/
具有XzKvP
与页面关联的唯一5个字符的代码。我希望能够生成相同类型的代码。
goo.gl也这样做:http ://goo.gl/UEhtg有UEhtg
怎么做?
基于随机子字符串的解决方案不好,因为输出会发生冲突。它可能会过早发生(运气不好),并且最终会在生成的值列表变大时发生。冲突的可能性甚至不必变得很大(请参阅生日攻击)。
对这个问题有好处的是,递增ID与对应ID之间的伪随机置换将显示在URL中。该技术保证了碰撞是不可能的,同时仍会生成与输入空间一样小的输出空间。
实作
我建议此Feistel密码的
C#版本具有32位块,3个回合和一个受伪随机生成器启发的 回合函数 。
private static double RoundFunction(uint input)
{
// Must be a function in the mathematical sense (x=y implies f(x)=f(y))
// but it doesn't have to be reversible.
// Must return a value between 0 and 1
return ((1369 * input + 150889) % 714025) / 714025.0;
}
private static uint PermuteId(uint id)
{
uint l1=(id>>16)&65535;
uint r1=id&65535;
uint l2, r2;
for (int i = 0; i < 3; i++)
{
l2 = r1;
r2 = l1 ^ (uint)(RoundFunction(r1) * 65535);
l1 = l2;
r1 = r2;
}
return ((r1 << 16) + l1);
}
要在base62字符串中表达置换的ID:
private static string GenerateCode(uint id)
{
return ToBase62(PermuteId(id));
}
该Base62
函数与上一个答案相同,除了要用uint
代替int
(否则,必须重写这些函数以处理负值)。
定制算法
RoundFunction
是该算法的秘诀。您可以将其更改为非公开版本,其中可能包含密钥。Feistel网络具有两个非常好的属性:
即使所提供的RoundFunction
是不可逆的,该算法也保证这PermuteId()
将是数学意义上的排列(这意味着零碰撞)。
即使在圆角函数内部稍稍更改表达式,也会大大改变最终输出值列表。
要注意的是,尽管在每个PermuteId
输出的唯一性方面仍然可以正常工作,但在舍入表达式中添加一些琐碎的东西会破坏伪随机效果。而且,从数学意义上讲不是函数的表达式将与算法不兼容,因此例如random()
不允许涉及任何内容。
可逆性
在当前形式下,PermuteId
函数是其自身的逆函数,这意味着:
PermuteId(PermuteId(id))==id
因此,给定程序产生的短字符串,如果uint
使用FromBase62
函数将其转换回,并将其作为输入提供给PermuteId()
,则它将返回相应的初始ID。如果您没有用于存储[内部ID
/短字符串]关系的数据库,那就太酷了:实际上并不需要存储它们!
产生更短的弦
以上函数的范围是32位,即从0到大约40亿个值2^32-1
。要在base62中表示该范围,需要6个字符。
仅用5个字符,我们就可以希望最多代表62^5
10亿以下的值。如果输出字符串限制为5个字符,则应对代码进行如下调整:
找出N
这样一个N
偶数,2^N
并尽可能高但低于62^5
。那是28,所以我们适合的实际输出范围62^5
将是2^28
大约2.68亿个值。
在中PermuteId
,请使用和而不是16位的28/2=14
位值,同时注意不要忽略输入的单个位(其必须小于2 ^ 28)。l1``r1
将结果乘以RoundFunction
16383而不是65535,以保持在14位范围内。
在的末尾PermuteId
,重新组合r1
并l1
形成一个14+14=28
位值,而不是32。
相同的方法可以应用于4个字符,输出范围为2^22
,或约400万个值。
它是什么样子的
在上述版本中,以id = 1开头的前10个生成的字符串为:
cZ6ahF
3t5mM
xGNPN
dxwUdS
ej9SyV
cmbVG3
cOlRkc
bfCPOX
JDr8Q
eg7iuA
如果我对round函数进行微不足道的更改,则变为:
ey0LlY
ddy0ak
dw3wm
bVuNbg
bKGX22
c0s5GZ
dfNMSp
ZySqE
cxKH4b
dNqMDA
在GitHub或BitBucket中每个存储库的主页上都显示了自述文件。md的格式非常漂亮。 有没有办法用红宝石做同样的东西?我已经找到了一些像红毯这样的宝石,但它看起来从来都不漂亮。我按照红毯的说明进行了操作。 我确信这不仅仅是缺少css,因为在3个反引号之后 (```) 我编写了或之类的语法,并在第一个图像中编写了它。 编辑2: 这里的这段代码:
问题内容: 我在htpasswd中使用“密码的强制MD5加密”来生成实例“ 123”的哈希,我得到: 使用htpasswd:123 => $ apr1 $ kaTbKaLO $ ewJXRZAKpjaxK4thy2jOp / 使用MD5摘要:123 => 202cb962ac59075b964b07152d234b70 请告诉我如何使用Java生成像apache htpasswd这样的哈希。 问题
我正在开发一个java程序,可以在嵌入式播放器中播放YouTube视频。问题是,大多数音乐视频都无法播放,我遇到了以下错误:“此视频包含(媒体公司名称)的内容。某些网站限制播放。” 我尝试在Chrome加载相同的URL,结果相同。https://www.youtube.com/embed/TMZi25Pq3T8 然而,经过一些研究,我很快就修复了它,安装了一个允许我添加HTTP请求头的Chrome
为什么jaxb在下面生成一个名为的类型参数? 这个文件是由JavaTM体系结构用于XML绑定(JAXB)参考实现生成的: 也许这是一个我不知道的设计模式?
问题内容: 我想启动一个将使用ajax push的应用程序,但是应该正确配置Web服务器,而且我不知道如何在服务器端组件上启动。 我想从dojo的cometd开始,然后阅读一些博客,说activeMQ较旧,并且是ajax push上的标记载体,但是还有另一个博客说,很难设置并使其工作。 现在,在开始之前我很困惑,请告诉我我的方式:)配置Ajax推送环境的最佳方法是什么? 思南 问题答案: 在斯洛文
我在repast simphony中建立了一个3D模型,它运行(相当)良好。然而,由于模型的性质,代理往往会形成密集的团块。我想知道是否有一种方法可以通过生成一个不断更新的2D显示或一个结束状态视图来生成一个穿过簇中间的2D切片或横截面,以查看代理在簇内做什么。 我探索了gui中的显示选项,并尝试了不同层次的代理,但由于密度,这些都不起作用。是否有办法稍微改变gui的这一方面,以在50x50x50
我使用jSoup解析所有的超文本标记语言从这个网站:新闻 我可以获取所有的倾斜,描述与选择一些我需要的元素。但找不到要选择的视频URL元素。我怎么能得到视频链接与jSoup或另一种库。谢谢!
proxy.conf.js在开发模式下按预期工作。 我在package.json文件中有这些文件用于启动和构建。 在我运行“NPM run Build”并使用结果文件在IIS8上托管网站后,需要使用代理设置的页面就不工作了。 例如,我的请求https://localhost/web/api/webclients/authentication应该转到https://10.109.102.109/we