goo.gl或jsfiddle等网站生成url码?我想生成类似goo.gl和jsfiddle网站(http://jsfiddle.net/XzKvP/)的代码。我尝试过不同的方法,给我的guid太大,重复字母数字代码等。我认为我应该能够根据数据库表中的主键生成字母数字代码。所以它不会重复?PK是一个自动递增整数1。但不确定应该如何完成。我希望代码看起来是随机的,但并非必须如此。例如,我不希望我的数据库中的项目1234是BCDE而项目1235是BCDF。示例:请注意urlhttp://jsfiddle.net/XzKvP/是如何与页面的唯一5字符代码XzKvP相关联的。我希望能够生成相同类型的代码。goo.gl也这样做:http://goo.gl/UEhtg有UEhtg这是怎么做到的?基于随机子字符串的解决方案并不好,因为输出会发生冲突。它可能会过早发生(运气不好),最终会在结果值列表变大时发生。碰撞的概率变高甚至不必那么大(参见生日攻击)。这个问题的好处是递增ID和对应ID之间的伪随机排列将显示在URL中。这种技术保证碰撞是不可能的,同时仍然产生与输入空间一样小的输出空间。实现我推荐这个C#版本的FeistelCipher,具有32位块、3轮和一个轮函数,其灵感来自伪随机生成器。privatestaticdoubleRoundFunction(uintinput){//必须是数学意义上的函数(x=y意味着f(x)=f(y))//但它不一定是可逆的。//必须返回一个介于0和1之间的值return((1369*input+150889)%714025)/714025.0;}privatestaticuintPermuteId(uintid){uintl1=(id>>16)&65535;uintr1=id&65535;uintl2,r2;for(inti=0;i表示一个base62字符串中的排列ID:privatestaticstringGenerateCode(uintid){returnToBase62(PermuteId(id));}Base62函数和前面的答案一样,只是取uint而不是int(否则必须重写函数以处理负值)。自定义算法RoundFunction是该算法的秘密。您可以将其更改为非公开版本,可能包括密钥。Feistel网络有两个非常好的属性:请注意,在循环表达式中放置一些太琐碎的东西会破坏伪随机效应,尽管它仍然可以在每个PermuteId输出的唯一性方面发挥作用。另外,在数学意义上不是函数的表达式不会与不兼容的算法一起工作,因此例如不允许涉及random()的任何内容。生成一个短字符串,如果使用FromBase62函数将其转换回uint,并作为PermuteId()的输入提供,则返回相应的初始ID。如果您没有用于存储[internal-ID/shortstring]关系的数据库,这将非常酷:它们实际上不需要存储!生成较短的字符串上述函数的取值范围是32位,即从0到2^32-1大约有40亿个值。要表示base62中的范围,需要6个字符。只有5个字符,我们想表示最多62^5个值,也就是不到10亿个。如果输出字符串限制为5个字符,则代码应作如下调整:4个字符可采用同样的方法,输出范围为2^22,即约400万个值。上面的版本中,以id=1开头的前10个生成的字符串是:cZ6ahF3t5mMxGNPNdxwUdSej9SyVcmbVG3cOlRkcbfCPOXJDr8Qeg7iuA如果我在round函数中做了一个微不足道的更改,那么这将变为:ey0LlYddy0akdDw3wmbVuNbgbKGX22c0s5GZdfNMSpZySqEcxKH4bdNqMDA您可以将五字母代码视为base-62表示法中的数字:您的“数字”是26个小写字母和26个大写字母,以及0到9位数字(26+26+10)。给定0到62^5(等于916132832)(例如,您的主键),您可以像这样转换为base-62的五位数:privatestaticcharBase62Digit(intd){if(d='0'&&c='A'&&c='a'&&ccurrent*62+Base62Decode(c));以下是如何生成加密强度高的随机数(您需要添加对System.Security的引用):privatestaticreadonlyRNGCryptoServiceProvidercrypto=newRNGCryptoServiceProvider();privatestaticintNextRandom(){varbuf=newbyte[4];crypto.GetBytes(buf);returnbuf.Aggregate(0,(p,v)=>(pThisisWhatIendedupdoing(updatedsinceDanielVérité'sanswer):以上是C#学习教程:Howdowebsitessuchasgoo.glorjsfiddlegenerateurl代码?分享全部内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注---classProgram{privatestaticdoubleRoundFunction(uintinput){//必须是一个数学意义上的函数(x=y意味着f(x)=f(y))//但它}privatestaticcharBase62Digit(uintd){if(d>16)&65535;uintr1=id&65535;uintl2,r2;for(inti=0;i本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
