У @Hashpassword такие же ограничения? Если нет - то комбинация @Password(@Hashpassword ...
Да, то же ограничение.
Можно было бы использовать NotesSession.HashPassword, у которой нет таких проблем, но в моём случае нужен статический хеш, - генерю ID для БД, и по этому ID в дальнейшем должен быть доступ к записи, а HashPassword генерит динамический - разный при каждом вызове на одних и тех же данных.
Короче как-то так:
Visual Basic:
%REM
Function encryptPassword
Description: генерирует статический хеш (контрольную сумму) из 32-х символов;
может использоваться для проверки целостности данных либо в качестве UNID
sData - данные, по которым нужно сгенерировать хеш
%END REM
Public Function encryptPassword(sData As String) As String
On Error GoTo ErrH
'если строка содержит > 1113 байт, то Lotus генерирует Err=221 'Invalid formula @Password(...)'
Const PORTION_LIMIT = 1000 'про запас, и для простоты отладки; не менять, т.к. изменится хеш!
Dim nDataLen As Long, nStart As Long, sPortion As String
nDataLen = Len(sData)
'Print "nDataLen = " & nDataLen
For nStart = 1 To nDataLen Step PORTION_LIMIT
sPortion = Mid$(sData, nStart, PORTION_LIMIT)
'Print nStart, Len(sPortion)
encryptPassword = encryptPassword + Mid(Join(Evaluate(|@Password({| + sPortion + |})|) ), 2, 32)
Next
If nDataLen <= PORTION_LIMIT Then Exit Function
encryptPassword = encryptPassword(encryptPassword)
Quit:
Exit Function
ErrH:
'MsgBox sPortion,, CStr(Len(sPortion))
Error Err, GetThreadInfo(1) & " (" & Erl & ") -> " & Error$
End Function
Добавлено: ерунда какая-то феерическая. На клиентской части код работает, а на серверной бьёт ту же ошибку. Заработал, когда уменьшил лимит ровно вдвое - на 1240.
Непонятно, ведь использую LenB, это ведь LenBP платформозависимая. Да и непонятно, ведь что клиент, что сервер - Винда... Может это из-за разных версий Винды такое?..
Добавлено 2021.11.16:
Иногда стала вылетать ошибка encryptPassword(19) -> Operation failed {221}.
1. Причина ошибки: 3-й параметр для Mid ненужно было высчитывать, из-за чего размер порции данных "гулял" в цикле и иногда превышал максимально допустимый. Нужно было просто передавать максимальную длину порции.
2. Переделал функцию с LenB и MidB$ на Len и Mid$, т.к. B-функции на сервере берут вдвое меньшую порцию, из-за чего для данных, превышающих половину указанной в константе порции, на сервере и клиенте невозможно было добиться генерации одинакового кеша. Также B-функции не рекомендуемы к использованию после Lotus R3 для работы со строками. Переход на Len и Mid$ позволил вдвое уменьшить количество циклов обработки.
3. Уменьшил размер порции с 1240 до 1000, т.к. Domino 8.5.x на Win2003 и полностью всех русских символах в предложениях (обычный текст - есть точки, запятые и пробелы) не может без ошибки выполнить @Password для порции более чем 1113 символов одновременно.