求高人帮忙解决一个经典算法问题
如何根据一个确定MD5散列生成唯一的一个同时包含256个不同字符的位串。PS:也就是根据当前的MD5值,构建一个相关的256个不同字符的全排列。只要算法即可,满意即给分。...
如何根据一个确定MD5散列生成唯一的一个同时包含256个不同字符的位串。
PS:也就是根据当前的MD5值,构建一个相关的256个不同字符的全排列。只要算法即可,满意即给分。在线等回答~
比如说 md5:098f6bcd4621d373cade4e832627b4f6 可以对应一个 (0,1,2,3,4,5……255)这样一个排列。现在是需要一种算法,让每一个MD5快速对应一个位串排列,要尽量打散的位串。
不明白的我这里再补充一下。
是这么个情况,举个例子。
md5:098f6bcd4621d373cade4e832627b4f6 -> (0,1,2,3,4,5……255)
md5:36806bcd4621d37d37944e832625796a -> (6,4,5,3,2,1……255)
md5:44444bcd4621d37d37942548976adcae -> (10,6,4,20,2,45……)
就是任何一个MD5离散唯一的对应一个256个数字的序列(字符序列数组位串),要求这256位序列是0-255之间不重复且顺序混乱的数字组成。求一种算法能快速方便的实现这个功能。 展开
PS:也就是根据当前的MD5值,构建一个相关的256个不同字符的全排列。只要算法即可,满意即给分。在线等回答~
比如说 md5:098f6bcd4621d373cade4e832627b4f6 可以对应一个 (0,1,2,3,4,5……255)这样一个排列。现在是需要一种算法,让每一个MD5快速对应一个位串排列,要尽量打散的位串。
不明白的我这里再补充一下。
是这么个情况,举个例子。
md5:098f6bcd4621d373cade4e832627b4f6 -> (0,1,2,3,4,5……255)
md5:36806bcd4621d37d37944e832625796a -> (6,4,5,3,2,1……255)
md5:44444bcd4621d37d37942548976adcae -> (10,6,4,20,2,45……)
就是任何一个MD5离散唯一的对应一个256个数字的序列(字符序列数组位串),要求这256位序列是0-255之间不重复且顺序混乱的数字组成。求一种算法能快速方便的实现这个功能。 展开
1个回答
展开全部
可以这样干,算法主干
首先理解
1、你要得到的字符序列个数是有限的,为256!个,(排列组合,能理解不)
2、从0~255的每个数字在计算机上用一个字节来表示一个你要的数字刚刚好,
2、给这些序列编一个号码,比如按从小到大排列为1、2、3……
接着理解
1、需要转换的序列为32个字符,我具体不清楚这个序列的规则,比如字符的种类有n种,但是序列种类不能大于256!,否则不是唯一的,
2、将你要转换的序列理解为一个很大的整数,这个整数不是十进制的,而是n进制的。
接着实现
1、将n进制数转换为一个10进制的数,(具体方法很多,但是要和你的要求匹配,不同的序列转换之后都是不同的10进制数)
2、根据这个10进制数作为号码,去获取你在刚开始表示的大整数。
首先理解
1、你要得到的字符序列个数是有限的,为256!个,(排列组合,能理解不)
2、从0~255的每个数字在计算机上用一个字节来表示一个你要的数字刚刚好,
2、给这些序列编一个号码,比如按从小到大排列为1、2、3……
接着理解
1、需要转换的序列为32个字符,我具体不清楚这个序列的规则,比如字符的种类有n种,但是序列种类不能大于256!,否则不是唯一的,
2、将你要转换的序列理解为一个很大的整数,这个整数不是十进制的,而是n进制的。
接着实现
1、将n进制数转换为一个10进制的数,(具体方法很多,但是要和你的要求匹配,不同的序列转换之后都是不同的10进制数)
2、根据这个10进制数作为号码,去获取你在刚开始表示的大整数。
追问
你这个办法我考虑过。把32个字符作为大整数倒是容易,不过要把这个大整数再转换为对应的(0~255)全排列就很困难了。反正我划了大半天公式,都没成功。
我很认可这种思路的谨慎性,它甚至可以让一个32个字符位串与一个(0~255)全排列位串唯一对应。只可惜实际运算比较复杂。
分就给你吧!这个我已经基本解决,虽然算法不是很好,但至少运算速度比较快,并且质量也不错。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询