请教:怎么根据一个字符生成一个唯一的5位数字?(50分)

  • 主题发起人 主题发起人 YongSoft
  • 开始时间 开始时间
Y

YongSoft

Unregistered / Unconfirmed
GUEST, unregistred user!
请教:怎么根据一个字符生成一个唯一的5位数字?
 
字符本身就对应一个ASCII码,你改一改不就可以生成5位数字了?
 
具体方法
 
比如‘a’为65,‘A’为97等,你愿意怎么处理成5位数字都可以,只要把ASCII码包含了就
可以,比如在前面加上三位固定的数字。
 
是一个字符串
 
字符串变化多多,怎么能保证生成的数字唯一?
 
如果字符串没有限制,不可能生成唯一的数字。试想将用一个算法将一亿个字符串编码成
5位数字(共有10万个),怎么可能没有重码?
 
可以考虑用字符的机内码,处理成5位.这样重码的机率会小一些.
 
如果是字符串的话,可以采用Hash运算(这也是唯一的方法)。在Java中,String类型就有Hash方法,
将一个字符串映射为一个整型数(32Bit)。
至于具体的Hash运算方法,有很多种算法。下面是我临时写的一个,献丑了。

function StrHash(Str:String):Integer;
const
MaxValue=99999
//5位数字
var
i,n,a,b:Integer;
begin
n:=Length(Str);
a:=123456789;
b:=987654321;
for i:=1 to n do
begin
a:=a*25+Byte(Str);
b:=(b div 2)xor Byte(Str) xor (b*3);
end;
Result:=a*b mod (MaxValue div 2)+MaxValue div 2
//确保>=0 (单独的Mod运算余数可能为负)
end;
 
谢谢楼上那位
 
不可逆的行么?

function StrEncInt(Str:String):Integer;
var
......
begin
for i:=1 to length(str) do
begin
....=byte(str)/3.1415926535897935;
....读取小数点后面的5位
....
end;
end;
 
我上面的算法有些过于复杂(还有点错误),下面是改进版:
(对Hash函数来说,速度是很重要的)
function StrHash(Str:String):Integer;
const
MaxValue=100000
//确保余数为5位数字
var ~~~~
i,n,a:DWord
//非负数
begin
n:=Length(Str);
a:=0;
for i:=1 to n do
a:=(a*25+Byte(Str)) xor ((DWord(Str)*13) shl 20);
Result:=a mod MaxValue
//0-99999
end;

to amsea:
Hash运算基本上都是不可逆的,因为它将任意长度的信息都映射到一个固定的范围,因此都不可
避免的有信息损失。(例如:将一个长度为6的字符串映射为4Byte的数字,至少有2Byte的信息损失,
当然,如果被映射的是一个长度小于等于4的字符串,则有可能没有信息损失)。
 
TO creation-zy:你是做什么的呀?是不是网络安全呀?
 
to danliyou:
?? 我现在什么也不做——打杂呢!
 
to creation-zy
测试了你的函数,当字符为:abc,abb,abf,....等是小于5位的整数。
 
后退
顶部