求算法。(200分)

  • 主题发起人 主题发起人 阿蛮
  • 开始时间 开始时间

阿蛮

Unregistered / Unconfirmed
GUEST, unregistred user!
有一串符,形式如:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(32位,16进制),现在想把它转换成xxxx-xxxx-xxxx-xxxx-xx(20位,16进制)的形式,
不知道怎样处理,本相按每4位分成一组,然后高位与低位相加,把得出的结果串起来,但
这样相加后,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx和yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
这两个本不相同的字符串得出的结果会有可能相同。[:(]
哪位大侠能指点一二,最好是帮写一函数,分不够再加。
 
不可能吧,32位表示的数据量远远大于20位的,而且都是16进制的,怎么行呢?
 
可以的,我只要求单向转换,只要把32位的弄成20位,而不必考虑这20位以后怎么样还原
成32位,但要求的是两个不同的字符串转换后不能相同。(感觉跟MD5类似)。[:D]
 
只好采用類md5算法啦,g(x,y,z)=(x or y) and (y or not Z) 等
 
既然要求两个不同的字符串转换后不同那么也就说原来32位的可以表示的所有字符串转换
以后都有固定的值,这其实还是一一对应的,
你要求的两个不同的转换以后还是不同那么已经不是单向转换了
仔细想想看啊,难道真是我理解错了?
 
32位里只会是123456789ABCDEF0,20位里也只有123456789ABCDEF0,其实就是一个加密过程,
过个加密是不可逆的,只能加密,别想从密文里解密成明文。
MD5中它可以把任意大的字符串、文件加密出来的密文都只有32位,这里不管他的原理是什么
反正它就是一个固定的16进制的字符串。我上文中指出的32位数其实就是经过MD5加密出来
的字符串,但32位太长,我无法使用,只能用到其中的18位,且格式为
xxxx-xxxx-xxxx-xxxx-xx(上文说成20位,其实是22位),18位是有效字符,4位是"-"。
 
既然已经是MD5散列之后的结果了,再用什么算法进行散列就是头上安头,多此一举了。
索性就截取前20位嘛。
 
可就是不知道不同的字串MD5后的结果前20位是否会出现重复(哪怕产生的机率在万分之一我都不能用)
 
次类问题永远无解,因为20位的无论如何也不可能和32的一一对应
——不管是否需要逆转
——只能让他重复少数
 
后退
顶部