求一个算法,把一数字和字母的混合字符串(16位)生成一个16位的数字
这个16位的 数字和字母的混合字符串 是全球唯一的(比如mds加密后的密文)
生成的16位数字也要有这样的效果

解决方案 »

  1.   

    //数字和字母的混合字符串(16位)
    到底是十六进制,还是任意的数字和字母的混合?//生成一个16位的数字
    这个有歧义,是二进制16位?还是十进制16位?甚或是十六进制?//数字和字母的混合字符串   是全球唯一的(比如mds加密后的密文)
    用什么来保证全球唯一?
    mds是什么?加密后的密文怎么能保证唯一?
      

  2.   

    不论采用什么算法,都不会保证其唯一性,因为16位的数字的全集个数小于数字和字母的混合字符串(16位)的全集个数,根本保证不了数字对应字符串的唯一性。
    不过楼主可以试试GetHashCode(),字符串的GetHashCode()取到的整数值不容易重复(但还是会重复)
      

  3.   

    16位应保证全球唯一算法比较难实现,可以考虑下Guid,是数字和ABCDEF的组合。实现算法可一参考开源的Mono类库源码
      

  4.   

    Windows中程序生成的GUID就是全球唯一的,当然是在使用正版的前提下。
      

  5.   

    如果生成的这串数字是从一台机器生成的,你可以利用时钟来生成这个全球唯一的字串。如果由多台机器产生的,可以通过识别不同的机器再加上这台机器上的时钟来生成这个全球唯一的字串。时钟方面,你可以使用UNIX的时间秒数,这个数是从1970.1.1开始到现在的秒数,当然这个数值会有一天到头,但相信到那天你的程序早已换版了。当然这只是思想之一。原则是:1. 单台机器生成的,你要保证连续生成的是唯一的。
        方法之一:利用时钟。但需要连续生成时,不要有同样的时种数值,否则也会有重值。2. 多台机器之间,你要保证能够区分这些机器。
        方法之一:利用操作系统的序列号
        方法之二:利用机器的序列号
        方法之三:利用外置的Dongle,或USB Key之类的。
      

  6.   

    感谢各位见言!致viena:10进制的16位数。转换后虽然不可能全球唯一,但我要尽可能接近全球唯一。那个mds写错了,抱歉,是md5,md5 16位加密是全球唯一的吧?致Q_282898034:md5的16位加密是全球唯一,生成16位数字是不能保证其全球唯一,我想要尽可能地接近全球唯一。有什么方法么?还有能详细讲下GetHashCode()么?我懂了会加分。致gzlucky:这是一个不错的方法,谢了,但不符合要求哦。我要是固定地算,不要随机啊之类的。
    --------------------------------------------------------------------------------
    致大家:看看我这样思路。把一种全球唯一的号(例如:硬盘序列号,MAC)通过md5生成16位的字符串。取前四位,和后四位,前四位用大写,后四位用小写。得到8位大小写组合的字符串,再把这个字符串对应转换成数字(例如:'A'->40,'a'->85,'1'->29...),就得到一个16位数字字符串。
    问:如果我全部用硬盘的物理序列号转换,那我得到的16位数字重复的概率有多大?能保证百万不重复或千万不重复,甚至更高么?
             
      

  7.   

    Guid Guid.NewGuid();Guid 已经将能够区分不同机器不同时间不同现场等等所有条件全部融合在一起生成了.
    从生成算法上来看, 任何目前4微D空间内不完全匹配的计算机是不能产生完全相同的GUID的.除非是人为的Guid.Parse(""), 几乎没有相同的生成.  
      

  8.   

    俺想得到16位显示的guid,怎么办?