Ошибка алгоритма генерации хеш-ключа кеш-памяти Firefox

Вы можете использовать локальную переменную Static, чтобы «запомнить», был ли обработчик хотя бы один раз или нет:

Private Sub SWName_Field_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Static executed As Boolean
    If Not executed Then
        SWName_Field.Text = ""
        executed = True
    End If
End Sub

Состояние локальной Static привязано к вашему UserForm ] instance - значение будет «запомнено» до тех пор, пока экземпляр формы жив.

Это означает, что если вы показываете экземпляр формы по умолчанию , состояние не обязательно будет сброшено. Вы захотите убедиться, что вы получаете новое состояние формы по умолчанию каждый раз, когда форма показывается, а не только в первый раз - для этого вы New заполняете форму:

With New UserForm1
    .Show
End With

Если вы просто делаете [ 117], то вы не контролируете, когда создается экземпляр формы, как это делает VBA.

Вы также захотите контролировать, когда экземпляр формы будет уничтожен - вы можете сделать это, обработав событие формы QueryClose:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = VbQueryClose.vbFormControlMenu Then
        Cancel = True ' cancel the destruction of the object
        Me.Hide ' hide the instance instead
    End If
End Sub

При этом объект будет уничтожен, когда выполнение достигнет End With. Без него объект будет уничтожен, если пользователь нажмет кнопку «X», и вы, вероятно, не захотите, чтобы это произошло (особенно если вам нужно получить доступ к состоянию формы после ее закрытия).

7
задан jedierikb 31 March 2009 в 12:44
поделиться

6 ответов

Вот то, как алгоритм работает:

initialize hash to 0
for each byte
    shift hash 4 bits to left (with rotate)
    hash = hash XOR character

визуально (16-разрядная версия):

00110000             = '0'
    00110001         = '1'
        00110010     = '2'
            00110011 = '3'
0100            0011 = '4'
00110101             = '5'
====================
01000110001000010000  (and then this will be 'rotated'
                       so that it lines up with the end)
giving:
        00100001000001000110

То, что это означает, - то, что, если Вы имеете строки той же длины и являетесь главным образом тем же, затем по крайней мере в одном случае, более низкие 4 бита символьных и верхних 4 битов следующего символа xor друг друга должны быть уникальными. Однако метод засовывания числа на 32 бита в таблицу мог бы быть еще более слабым, означая, что это требует, чтобы lower4 xor upper4 конкретного местоположения в строке (модификация 8 символов) был уникален.

5
ответ дан 6 December 2019 в 14:09
поделиться

Из того, что я понимаю просто чтения записи Bugzilla, декларации ошибки, когда две отличных проблемы происходят:

  1. Их хеш-алгоритм генерирует коллизии для URL, которые "достаточно подобны". От ошибки, "достаточно подобной", кажется, означает каждые 4 символа (или возможно 8), URL являются тем же, и
  2. Их логика для контакта с хэш-коллизиями перестала работать, потому что они еще не сбросили предыдущий URL с тем же значением хэш-функции к диску.

Так в основном, если у Вас есть страница с двумя очень похожими URL, это могло бы произойти на некоторых версиях Firefox. Этого обычно не будет происходить на различных страницах, я ожидал бы, с тех пор FF будет иметь время для сбрасывания записей в диск, избегающий проблемы синхронизации.

Таким образом, если у Вас есть несколько ресурсов (сценарии, изображения, и т.д.), которые все загружаются из той же страницы, удостоверьтесь, что у них есть выполнение 9 символов, которые полностью отличаются. Одним путем Вы могли бы удостовериться, что это путем добавления querystring (что Вы игнорируете) со случайным битом данных, чего-то как:

6
ответ дан 6 December 2019 в 14:09
поделиться

This bug was a major issue for my site: http://worldofsolitaire.com

I worked around it a long time ago by using a conditional rule in an .htaccess file that would disable ALL caching of images on the site for Firefox users. This was a horrible thing to need to do, but at the time I couldn't track down the bug within Firefox and having the site be slightly slower is better than showing duplicate/corrupted images.

When I read in the linked bug that it was fixed in the latest Firefox releases, I changed the conditional on April 19th 2009 (yesterday) to only disable caching for Firefox 2 users.

A few hours later I've received over 10 e-mails from Firefox 3 users (confirmed) that they were seeing duplicate images. So this issue is STILL a problem in Firefox 3.

I decided to create a simple Linux test program that would allow me to check URL's to see if they are generating the same cache hash keys.

To compile in any Linux system: g++ -o ffgenhash ffgenhash.cpp

Here is the code (save to file ffgenhash.cpp)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define ULONG_MAX 0xFFFFFFFF
#define PR_ROTATE_LEFT32(a, bits) (((a) << (bits)) | ((a) >> (32 - (bits))))

unsigned long ffgenhash(const char * key)
{
    unsigned long h=0;

    for(const unsigned char * s = (unsigned char *) key; *s != '\0'; ++s)
    {
        h = PR_ROTATE_LEFT32(h, 4) ^ *s;
    }

    return (h==0 ? ULONG_MAX : h);
}

int main(int argc, char ** argv)
{
    printf("%d\n", ffgenhash(argv[1]));
    return 0;
}

As you can see, here are two real life URL's that generate the same cache hash key:

./ffgenhash "http://worldofsolitaire.com/decks/paris/5/12c.png"
1087949033
./ffgenhash "http://worldofsolitaire.com/decks/paris/5/13s.png"
1087949033

Since I pre-load these images in a Javascript loop, trying to use some sort of empty