Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2008, 16:37   #1
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию Как создать обратную функцию, которая из уникального номера будет возвращать строку?

Добрый день!

Есть функция (function Unc2Str(s: string): UInt64), которая строку преобразует в уникальный номер, а как создать обратную функцию (function Str2Unc(Unc: UInt64): String), которая из уникального номера будет возвращать строку:

type
UInt64 = 0..9223372036854775807;

function Unc2Str(s: string): UInt64;
var
x: Integer;
begin
Result := 0;
for x := 1 to Length(s) do Result := Result + ((Ord(s[x])) shl ((x - 1) * 8));
end;

Всем спасибо за помощь!
SkAndrew вне форума Ответить с цитированием
Старый 06.04.2008, 18:41   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Никак. По определению. Только через таблицы/массивы/деревья и т.п.
B_N вне форума Ответить с цитированием
Старый 06.04.2008, 18:58   #3
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

А так ли уникально число, которое получается при вызове Unc2Str ?
Для коротких строк Вы всего лишь перегоняете 8 байт строки в 8 байт числа. Для строк больше 8 символов вернуть всю строку уже не получится, но для строк < 8 байт:

Код:
function Str2Unc(x: UInt64): String;
begin
   Result := '';
   While x > 0 do begin
      result := result + chr((x and $FF));
      x := x shr 8;
   end;
end;
alexBlack вне форума Ответить с цитированием
Старый 06.04.2008, 19:51   #4
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию Как можно реализовать такие же функции для строк большего числа символов?

Спасибо жза ответ!

А как можно реализовать такие же функции для строк большего числа символов?

Спасибо за ответ!
SkAndrew вне форума Ответить с цитированием
Старый 06.04.2008, 20:06   #5
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию Ваша функция alexBlack не работает и до 8 символов!

для alexBlack

Я проверил Вашу функцию обратного получения строки - она не работает и до 8 символов. Хотя хотелось бы решение для неограниченного числа символов. Как же решить проблему?
Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 06.04.2008, 20:47   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от SkAndrew Посмотреть сообщение
для alexBlack
Я проверил Вашу функцию обратного получения строки - она не работает и до 8 символов. Хотя хотелось бы решение для неограниченного числа символов. Как же решить проблему?
Спасибо.
Вот так работает, но только до 8-ми символов:

Код:
function Unc2Str(s: string): UInt64;
var x: Integer;
    C:UInt64;
begin
   Result := 0;
   for x := 1 to Length(s) do begin
      C := Ord(s[x]);
      Result := Result + ((C) shl ((x - 1) * 8));
   end;
end;

function Str2Unc(x: UInt64): String;
begin
   Result := '';
   While x > 0 do begin
      result := result + chr((x and $FF));
      x := x shr 8;
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var x:UInt64;
    s:String;
begin
   x := Unc2Str('testabcd');
   s := Str2Unc(x);

   label1.Caption := s;
end;
Для большего количества символов вернуть обратно всю строку не получится.
alexBlack вне форума Ответить с цитированием
Старый 06.04.2008, 20:58   #7
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию Хотелось бы найти решение для любого числа символов в строке.

Спасибо, да так работает, но хотелось бы найти решение для любого числа символов в строке. Может у кого есть идеи как это можно решить?
Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 06.04.2008, 21:03   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

А для чего это. Может изменить сам подход к решению ?
alexBlack вне форума Ответить с цитированием
Старый 06.04.2008, 21:10   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от SkAndrew Посмотреть сообщение
Спасибо, да так работает, но хотелось бы найти решение для любого числа символов в строке. Может у кого есть идеи как это можно решить?
Спасибо.
SkAndrew, есть такая вещь - необратимые хэш-функции. У Вас - одна из них. Int64 может принимать максимум 2^64 (примерно 10^19) различных значений, а строка длиной, скажем, 32 символа - 2^(8*32) - примерно 10^77 значений, т.е. на каждое "уникальное" число будет приходиться почти 10^60 разных строк. Какую из них Вы планируете восстановить?
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать процедуру и функцию? Absent Общие вопросы Delphi 1 18.11.2007 17:36
Работа с DLL - программа, которая будет общаться с файлами данных, представленных в текстовом виде SnakeMan Общие вопросы Delphi 31 02.11.2007 13:35
Скажите функцию которая будет запускать приложение при каждой загрузке винды pentiumForever Общие вопросы Delphi 9 08.09.2007 01:54
как вызвать в Dll по указателю функцию, которая определена в главном потоке? SaintRain Общие вопросы Delphi 1 25.11.2006 08:27
как вызвать из Dll функцию, которая определена в главном потоке? SaintRain Win Api 1 23.11.2006 20:08