private String getFileID(String fileid,double seed){  
  String mixed = getFileIDMixString(seed);  
  String[] ids= fileid.split("\\*");  
  StringBuilder realId = new StringBuilder();  
  int idx;  
  for (int i=0; i< ids.length; i++){  
    idx = Integer.parseInt(ids[i]);  
    realId.append(mixed.charAt(idx));  
  }  
  return realId.toString();  
}  
  
private String getFileIDMixString(double seed){  
  StringBuilder mixed = new StringBuilder();  
  StringBuilder source = new StringBuilder(  
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890");  
  int index, len = source.length();  
  for (int i=0; i< len;++i){  
    seed = (seed * 211 + 30031) % 65536;  
    index = (int)Math.floor(seed/65536 * source.length());  
    mixed.append(source.charAt(index));  
    source.deleteCharAt(index);  
  }  
  return mixed.toString();  
javadelphi

解决方案 »

  1.   

    自己翻译出了一部分,不知道对不对function getFileIDMixString(seed:Double):string;
    var
      mixed:string;
      index,len,i:Integer;
    begin
      index:=Length(source);
      len:=Length(source);
      for i := 0 to len do
      begin
        seed:=(seed * 211 + 30031) mod 65536;
        index:=floor(seed/65536 * length(source));
        mixed:=mixed+copy(source,index,1);
        source:=Delete(source,index,1);
      end;
      Result:=mixed;
    end;
      

  2.   

    不懂java,不过java跟c#极度相似,稍微搜了下java的说明,不论对错试着写写function getFileIDMixString(seed: Double): AnsiString;
    var
      source: AnsiString;
      i, index, len: Integer;
    begin
      Result := '';
      // 源字串 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890
      source := //  一个 \ 在java里是转移符,下面字串的 \\ 可能需要改为 \
      'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\:._-1234567890';
      index := Length(source);
      len := index;  for i := 0 to len - 1 do
      begin
        seed := Floor(seed * 211 + 30031) mod 65535;
        index := Floor(seed) div 65536 * Length(source);
        Result := Result + source[index + 1];
        Delete(source, index, 1);
      end;end;function getFileID(fileid: AnsiString; seed: Double): AnsiString;
    var
      mixed: AnsiString;
      ids: TStringList;
      i, idx: Integer;
    begin
      Result := '';
      mixed := getFileIDMixString(seed);
      ids := TStringList.Create;
      // string.split("\\*"); 的 \\* 应该是匹配 *字符?
      ids.Delimiter := '*'; // 若如此,那么就用 * 来做字符串分隔的符号
      ids.Text := fileid;  // java string 索引从0开始,delphi 从1开始
      for i := 0 to ids.Count - 1 do
      begin
        if (TryStrToInt(ids[i], idx)) then
          Result := Result + mixed[idx + 1];
      end;
      ids.Free;
    end;
      

  3.   

    c#中也有StringBuilder类,delphi中只有高版本(貌似d2009开始)才有,为兼容低版本不管它直接用字符串得了