Re: Hashcode/ETag for EOs
Re: Hashcode/ETag for EOs
- Subject: Re: Hashcode/ETag for EOs
- From: Pascal Robert <email@hidden>
- Date: Sun, 29 May 2011 15:18:36 -0400
Le 2011-05-29 à 14:51, Farrukh Ijaz a écrit :
> Hi Pascal,
>
> On 2011-05-29, at 9:20 PM, Pascal Robert wrote:
>
>> I did :
>>
>> ERXRouteResults results = (ERXRouteResults)response(someEntity, filter);
>> String etagHash = ERXCrypto.sha256Encode(results.responseNode().toString(results.format(), this.restContext()));
>
> IMO, this is an expensive approach because of encryption algorithm. Unless encryption of the data is key requirement, don't use it.
I only need a hash. Base64 or MD5 would be ok too.
> Because normally the toString() if not overridden returns a String comprising the memory address of the instance, this is the reason a simple hashCode() call is not sufficient in your case. You can simply override the hashCode() method and compute the values based on your entity attributes.
The problem is that it had to be compute from the attributes that are part of the (ERXKeyFilter) filter. And I do think it should be using the format requested too, so that if someone ask for a JSON representation and someone ask for a XML one, the ETag would be different. But we can debate on that, because I'm not 100% sure that the same object but using represented in a different format should have a different ETag.
> For caching use Hashtable but that will only benefit if your hashCode() generates unique value. In my experience the best way to cache the values is to maintain a binary tree using the hashCode() as the node value. If you want to implement a better caching, try exploring Splay tree model. With a little modification to it, you can make you caching super fast.
>
> These things are not normally practiced by API users but they do matter is you develop your own API to be used by someone else :)
>
> Farrukh
>
>>
>>> there's not a direct simple way to do it ... probably grab the snapshot off the EO and compute a hash of the values (you can ignore the keys because they're fixed). it might be something where you can make a new interface in ERX that your EO's could implement to provide a more optimal impl (like ERCStamped could use its lastModified as a basis).
>>>
>>> ms
>>>
>>> On May 25, 2011, at 1:55 PM, Pascal Robert wrote:
>>>
>>>> I'm trying to find a way to generate a HTTP ETag for EOs so that caching can be done for REST services. What I want to do is to have the same ETag value for each representation of the EO, so when one of the values change, the ETag value will also change, but if the EO have the same value, it will generate the same ETag as another request got.
>>>>
>>>> Problem is: I don't know what to use. I tried with myEO.hashCode() but I did some tests and every time I fetch the EO, the hashcode is different even if the data didn't change. I'm thinking of doing a MD5 digest of part of the EO, but I was wondering if another way exist? I could use a "last modified" date and generate a MD5 of that too, but that date is a better option for the Last-Modified header.
>>>>
>>>> --
>>>> Pascal Robert
>>>> email@hidden
>>>>
>>>> WOWODC 2011 : July 1-2-3, Montreal. wowodc.com
>>>>
>>>> AIM/iChat : MacTICanada
>>>> LinkedIn : http://www.linkedin.com/in/macti
>>>> Twitter : pascal_robert
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Do not post admin requests to the list. They will be ignored.
>>>> Webobjects-dev mailing list (email@hidden)
>>>> Help/Unsubscribe/Update your Subscription:
>>>>
>>>> This email sent to email@hidden
>>>
>>
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Webobjects-dev mailing list (email@hidden)
>> Help/Unsubscribe/Update your Subscription:
>>
>> This email sent to email@hidden
>
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden